C語言stdio h標準庫EOF的 1為什麼用括號括起來?

時間 2021-06-05 15:20:05

1樓:

#define簡單粗暴的乙個理解就是文字替換既然是文字替換就容易產生語義與本意不同,加個括號就能防止這樣的bug產生

比如 #define myMax(a,b) a>b?a:b當你執行語句

intnum=1

+myMax(10

,20);你的本意應該是給num賦值 1 加上10和20中更大的那個數但是因為define是文字替換的緣故,你的程式實際上是這樣的intnum=1

+10>20?

10:20;

它的語義是11>20?10:20,表示式的值20很明顯程式的語義與你的本意不同,那麼如果加上乙個括號#define myMax(a,b) (a>b?

a:b)再來看源程式就變成了

intnum=1

+(10>20?

10:20);

加上乙個括號就能有效的防止由於程式的語義與自己的本意不同,而產生一些bug了

2樓:wyxsdzz

高手寫巨集,通常一定會把替換列表加上括號。即:

#define 巨集名 (替換列表)

這樣是為了使巨集名是乙個基本表示式(primary-expression),預防某些潛在的錯誤。

外行寫巨集一般是不加那對()的,某些考試甚至把這當考點,荒唐可笑。

c語言中的EOF的詳細情況?

通常EOF在stdio.h裡定義為 1,C把乙個位元組定義為char型別使用的位數,通常是8位,允許char前使用signed和unsigned表示有符號型別和無符號型別。getchar 返回的unsigned char永遠不為負數,EOF是它不可能的值,所以while裡的判斷條件始終成立,始終不能...

請教下關於C語言的EOF的理解?

對於問題1,首先檢視getchar 函式的說明文件,返回值型別是int而不是char或unsigned char,當正常讀取到字元時,把字元的型別提公升為int型別返回,而如果讀取到結束符或者讀取過程中出現其他錯誤,則返回EOF 而在g clang,msvc這些常見的編譯器的中,EOF定義為 1。實...

C語言怎麼僅使用標準庫讀取該軟體當前安裝目錄?

Glavo 標準庫沒有提供這類功能,這個功能在不同平台有不同的處理方式,通常獲取可執行檔案路徑,再查詢相對路徑就可以實現。最常見的幾個平台裡,Windows 有乙個 GetModuleFileNameW 方法能獲取到可執行檔案的絕對路徑 Linux 環境的話,不少發行版都可以通過讀取 proc se...