回傳兩個數字中較大者的宏(見下文)加 1。但是,不存在加法的效果。
PS:我還通過在宏中添加過多的括號進行了檢查。
#define max(a,b) (a >= b ? a : b);
void main(){
int result = max(5,10) 1; //result = 10
}
解決方案: 案例 1:
通過手動替換運算式中的宏(我認為就像前處理器所做的那樣),可以正確執行添加。
result = (5 >= 10 ? 5 : 10) 1; // Evaluates correctly to 11.
情況 2: 當運算元的順序顛倒時,運算式也會正確計算。
result = 1 max(5,10); //Evaluates correctly to 11.
為什么原始運算式沒有按預期作業,而兩個解決方案案例呢?
uj5u.com熱心網友回復:
您錯誤地添加;到您的宏中。所以擴展實際上是
void main(){
int result = (5 >= 10 ? 5 : 10); 1;
}
在這里你 1變成了一個單獨的陳述句,它什么都不做,并被result初始化為10.
順便說一句,如果您使用 gcc 或 Clang,有一個-E標志將在您的源代碼上運行實際的前處理器。上面的代碼是通過運行gcc -E a.c您的代碼獲得的。
我還建議使用最大可能的警告級別進行編譯。例如,gcc -Wall -Wextra -Werror a.c提示有問題:
a.c:2:6: error: return type of 'main' is not 'int' [-Werror=main]
2 | void main(){
| ^~~~
a.c: In function 'main':
a.c:3:28: error: statement with no effect [-Werror=unused-value]
3 | int result = max(5,10) 1; //result = 10
| ^
a.c:3:9: error: unused variable 'result' [-Werror=unused-variable]
3 | int result = max(5,10) 1; //result = 10
| ^~~~~~
cc1.exe: all warnings being treated as errors
uj5u.com熱心網友回復:
那是因為你在宏后面放了一個分號
#define max(a,b) (a >= b ? a : b);
^^^
去掉它。
宏應該寫成
#define max(a,b) ( ( a ) >= ( b ) ? ( a ) : ( b ) )
所以在第一種情況下,你實際上有
int result = ( 5 >= 10 ? 5 : 10 );
1;
如果您將宣告
int result = max(5,10) 1;
在函式 main 之前的檔案范圍內,編譯器將發出錯誤,因為會有陳述句
1;
并且您不能在檔案范圍內放置陳述句。
至于這個說法
result = 1 max(5,10);
然后它擴展為兩個陳述句
result = 1 ( 5 >= 10 ? 5 : 10 );
;
也就是說,還有一個無效的空陳述句。
注意,根據 C 標準,沒有引數的函式 main 應宣告為
int main( void )
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/366242.html
上一篇:為什么我的賬單計算功能不起作用?
