我已經做了一點PHP,當你聲明變量時,你不需要聲明類型(例如string或int)。爲什麼我們需要在C++ printf函數中指定格式說明符中的類型?
但是我必須調整一個非常簡單的C文件,並且爲了讓打印函數正常工作,我必須爲每個變量的輸出包含一個類型說明符。
爲什麼不能從變量本身自動推斷此類型?
我已經做了一點PHP,當你聲明變量時,你不需要聲明類型(例如string或int)。爲什麼我們需要在C++ printf函數中指定格式說明符中的類型?
但是我必須調整一個非常簡單的C文件,並且爲了讓打印函數正常工作,我必須爲每個變量的輸出包含一個類型說明符。
爲什麼不能從變量本身自動推斷此類型?
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++流進行輸出,這並不是什麼問題。
最常見的說明符:
%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/
C是一種非常簡單的語言,我指的是它提供了裸機一個相當小的抽象。基本類型附帶否附加的型號信息,甚至struct
只能得到什麼類型的信息你給他們。
因此,在一個典型的實現,當編譯器看到
int x, y;
float z;
int x = foo(y,z);
x
,y
,並且z
很可能一個機器字被解釋爲x
一個二進制補碼整數和'Y,並作爲z的IEEE-754浮點值,和沒有別的。
的編譯器類似
push
y
和z
(它做什麼,爲了這是依賴於實現)push
當前stack pointer+two instructions
作爲返回地址branch
到foo
的入口點。(體面的芯片提供了一些支持,amke這更容易,但仍...)
那麼Foo就
y
和z
對它們做任何事x
(再次從棧指針偏移量中找到)branch
回到調用例程push
編輯的返回地址。如果foo
沒有指示什麼類型傳遞的參數有(如在variadac常規喜歡printf
),它不會知道堆棧上的每個參數有多大(實際上ç強求每個variadac參數的大小有一套上轉換規則來解決這個問題),也不知道如何解釋它。
另一方面,PHP在裸機上提供了一個複雜的抽象,並且可以(事實上必須做它的工作)攜帶一些與其一起工作的值的標識信息。
謝謝,出於好奇,你爲什麼會努力寫出這樣一個詳細的問題,很久以前就已經選擇了最好的答案? – user784637
請爲我們詳細說明一下。我無法弄清楚你在問什麼。 –
http://www.cplusplus.com/reference/clibrary/cstdio/printf/ – NullUserException
不要在問題標題中提問,或者至少在問題本身中重複提問。 –