定義一個宏用C
回答
宏僅供預處理器使用。這就是將C編譯器被編譯:
(((I++)>(J++))? ((I++):(J++)))
正如你所看到的,如果我是大大於j,然後我會得到增加兩次和J一次,否則它反之亦然。
你的宏是不正確的。括號中的外層是錯在這裏,這將導致編譯錯誤:
((I++):(J++))
值得一提的是:它是定義的行爲,因爲在評估左操作數之後存在序列點(布爾型編碼)。這在宏中不是微不足道的,例如:'MAX(I ++,I ++)'會導致未定義的行爲,因爲'I'在同一個表達式中增加了兩次。 – amit
MAX(I++,J++)
將擴大至(((I++)>(J++))? ((I++):(J++)))
。請注意,有兩次出現I++
和J++
,所以在比較之後它們都會增加,然後取得的結果將再次遞增。
你可以使用內聯函數:
inline int MAX(int x, int y)
{
return x > y ? x : y;
}
但我想宏觀對任何類型的工作的優勢。
,除非I和J是64位整數...... – Shahbaz
正如我所說的,我認爲這個宏具有爲任何類型工作的優勢(而你需要爲每個類型使用不同的函數)。 –
在int res = MAX(x,y);
宏將花費到
(((x) > (y)) ? (x):(y));
現在
如果x = a++
和y = b++
中條件不錯,將轉化爲
(((a++) > (b++)) ? (res = a++):(res = b++));
因此,對於路徑,無論哪個變量是意志總共兩次,但存儲在res
中的結果值只會有一個增量(因爲您正在使用後增量)。
在函數/宏調用中使用post-inc可能會非常棘手,因爲它們會引入細微的邏輯故障。
更喜歡按照原樣將變量傳遞給函數/宏,並對其進行獨立的更改,這將爲您節省這類問題的時間。
- 1. C宏一次定義多個變量
- 2. 定義一個宏的函數定義
- 3. RELEASE C++宏定義
- 4. C++使用宏來定義一個類的類成員
- 5. C++中的宏可以定義宏嗎?
- 6. C預處理器宏定義宏
- 7. C++/Qt定義/未定義QT_NO_SESSIONMANAGER宏
- 8. 宏定義宏
- 9. C++ 11預定義的宏
- 10. Microsoft C++預定義的宏
- 11. C++宏定義不清
- 12. 自定義C++聲明宏
- 13. C++宏定義包括點?
- 14. C++ - 宏定義指令
- 15. C宏重新定義
- 16. C宏/#定義縮進?
- 17. Objective-C宏重新定義
- 18. 宏重定義和C++
- 19. C宏保護定義
- 20. elixir中的宏擴展:如何使用另一個宏來定義2個宏?
- 21. SAS:調用另一個宏...宏定義的順序
- 22. ...傳遞參數的定義宏用C
- 23. 如何使用C定義Excel宏#
- 24. 用SCons定義C++預處理器宏
- 25. 用於定義符號的C宏
- 26. 爲什麼#定義一個空的宏?
- 27. 定義在bash一個函數宏
- 28. __NSX_PASTE__定義一個宏需要什麼?
- 29. <algorithm>定義了一個宏X?
- 30. 定義一個宏來替換代碼
你得到了什麼答案?你期望什麼答案? – Krishnabhadra