我一直在做 K&R: The C Programming Language 的練習,并注意到一些讓我有點困惑的東西。
#include <stdio.h>
#define BLANK ' '
int c;
int d;
d = 0;
c = getchar();
當我執行此代碼時,即使將 getchar() 分配給變數“c”,也會呼叫 getchar(),但從未呼叫過“c”。我也只是將變數 'c' 更改為
c = printf("hi");
執行程式時列印“hi”。所以,這種行為是一致的,但對我來說仍然沒有意義。
uj5u.com熱心網友回復:
這對于許多命令式編程語言來說是相當標準的1 - 該陳述句c = getchar();意味著程式應該在那個時間點呼叫getchar()(它從標準輸入中讀取一個字符,必要時等待),并將其回傳值存盤到某個存盤位置分配給名為 的變數c。您稍后不使用的事實c是無關緊要的(請注意,我使用“使用”一詞,而不是像您那樣使用“呼叫”一詞;我們不呼叫變數)。
在您的第二個示例中printf,您有一個具有非常明顯副作用的函式(列印到控制臺)。同樣,這種副作用發生在陳述句c = printf(...)執行時,而不是c以后使用時。
您還會注意到,在以下代碼段中,getchar 僅被呼叫一次,無論您是否使用c零次、一次、兩次甚至更多次的值:
int c;
c = getchar();
printf("%c", c);
printf("%c", c);
1還有其他語言家族,其中確實有一些變數指代尚未發生的計算。這樣的事情在函式式語言中經常出現在各種場景中,但 C 不屬于這一類。
2這個問題涉及兩個具有副作用和/或不純的功能。如果您更深入地研究該語言并開始學習并發編程或編譯器設計等內容,您應該知道這些規則適用于可見效果,例如您觀察到的副作用。如果一個函式僅根據其輸入引數進行計算而沒有外部影響(如控制臺輸入或讀取共享記憶體位置)或副作用(如控制臺輸出或寫入共享記憶體位置),那么會有更微妙的影響(比如編譯器對你看不到效果的東西重新排序,以提高效率,同時仍然確保你能看到的副作用遵循這里討論的規則)
uj5u.com熱心網友回復:
如果你有c = &getchar(但c必須是 typeint (*)(void)而不是int),它會像你描述的那樣,因為你會保存一個指向getcharin的函式指標c。然后你就可以c()稍后再做。
但是你在getchar()這里已經是一個函式呼叫了!所以函式()在這一行被呼叫(使用 operator ),結果存盤在c.
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/468818.html
上一篇:使用.*寬度說明符呼叫sprintf時出現奇怪的警告
下一篇:如何正確重新分配字串陣列?
