2011-09-14 25 views
0

我已經做了一點PHP,當你聲明變量時,你不需要聲明類型(例如string或int)。爲什麼我們需要在C++ printf函數中指定格式說明符中的類型?

但是我必須調整一個非常簡單的C文件,並且爲了讓打印函數正常工作,我必須爲每個變量的輸出包含一個類型說明符。

爲什麼不能從變量本身自動推斷此類型?

+1

請爲我們詳細說明一下。我無法弄清楚你在問什麼。 –

+0

http://www.cplusplus.com/reference/clibrary/cstdio/printf/ – NullUserException

+0

不要在問題標題中提問,或者至少在問題本身中重複提問。 –

回答

2

printf因爲是C++,其中類型檢測是不那麼熱:-)

有被用於在格式字符串的說明符和數據項之間的斷開的C-兼容性部分的一部分例如:

printf ("String at memory %p is '%s'\n", mystr, mystr); 
printf ("That character is '%c', ASCII code %d, hex %02x\n", mych, mych, mych); 

如果您使用C++流進行輸出,這並不是什麼問題。

0

最常見的說明符:

%d /%i是一個整數
%C是對於char
%s是一個字符串
%f是用於浮法/雙

例如:

int i = 1; 
char hi[6] = "Hello" 
printf("%d %s", i, hi); 

將打印

1 Hello 

如上面給出的,你可以參考http://www.cplusplus.com/reference/clibrary/cstdio/printf/

2

C是一種非常簡單的語言,我指的是它提供了裸機一個相當小的抽象。基本類型附帶附加的型號信息,甚至struct只能得到什麼類型的信息給他們。

因此,在一個典型的實現,當編譯器看到

int x, y; 
float z; 
int x = foo(y,z); 

xy,並且z很可能一個機器字被解釋爲x一個二進制補碼整數和'Y,並作爲z的IEEE-754浮點值,和沒有別的

的編譯器類似

  • 提前堆棧指針,以留出空間返回值壓入堆棧
  • pushyz(它做什麼,爲了這是依賴於實現)
  • push當前stack pointer+two instructions作爲返回地址
  • branchfoo的入口點。

(體面的芯片提供了一些支持,amke這更容易,但仍...)

那麼Foo就

  • 讀取它們的位置相對於當前籌碼堆值
  • yz對它們做任何事
  • 寫入返回到x(再次從棧指針偏移量中找到)
  • branch回到調用例程push編輯的返回地址。

如果foo沒有指示什麼類型傳遞的參數有(如在variadac常規喜歡printf),它不會知道堆棧上的每個參數有多大(實際上ç強求每個variadac參數的大小有一套上轉換規則來解決這個問題),也不知道如何解釋它。

另一方面,PHP在裸機上提供了一個複雜的抽象,並且可以(事實上必須做它的工作)攜帶一些與其一起工作的值的標識信息。

+0

謝謝,出於好奇,你爲什麼會努力寫出這樣一個詳細的問題,很久以前就已經選擇了最好的答案? – user784637

相關問題