2 回答

TA貢獻(xiàn)1982條經(jīng)驗(yàn) 獲得超2個(gè)贊

TA貢獻(xiàn)1844條經(jīng)驗(yàn) 獲得超8個(gè)贊
僅僅為了記錄,我從這里登陸如何在使用宏時(shí)修復(fù)數(shù)學(xué)錯(cuò)誤,我將嘗試在此處擴(kuò)展此答案以適應(yīng)其他人。
你在詢問有關(guān)的區(qū)別:
#define Echo( a ) a#define Echo( a ) ( a )
只要你不了解自己的宏(我也不是專家:)這是好的。
首先,您已經(jīng)(可能)知道存在運(yùn)算符優(yōu)先級(jí),因此這兩個(gè)程序存在巨大差異:
1):
#include <stdio.h>#define ADD( a , b ) a + bint main( void ){ auto const int a = 5; auto const int b = 10; auto const int c = ADD ( 2 + a , 2 + b ); printf( "%d", c ); return 0;}
輸出:
19
和:
#include <stdio.h>#define ADD( a , b ) ( a ) + ( b )int main( void ){ auto const int a = 5; auto const int b = 10; auto const int c = ADD ( a , b ); printf( "%d", c ); return 0;}
輸出:
15
現(xiàn)在,讓我們preplace +
有*
:
#define ADD( a, b ) a * b
編譯器對(duì)待a * b
例如a == 5
,b == 10
哪個(gè)做5 * 10
。
但是,當(dāng)你說: ADD ( 2 + a * 5 + b )
喜歡這里:
#include <stdio.h>#define ADD( a , b ) ( a ) * ( b )int main( void ){ auto const int a = 5; auto const int b = 10; auto const int c = ADD ( 2 + a , 5 + b ); printf( "%d", c ); return 0;}
你得到105
,因?yàn)樯婕斑\(yùn)營(yíng)商優(yōu)先權(quán)并對(duì)待
2 + b * 5 + a
如
( 2 + 5 ) * ( 5 + 10 )
是的
( 7 ) * ( 15 )
== 105
但是當(dāng)你這樣做時(shí):
#include <stdio.h>#define ADD( a, b ) a * bint main( void ){ auto const int a = 5; auto const int b = 10; auto const int c = ADD ( 2 + a , 5 + b ); printf( "%d", c ); return 0;}
你得到的37
是因?yàn)?/p>
2 + 5 * 5 + 10
意思是:
2 + ( 5 * 5 ) + 10
意思是:
2 + 25 + 10
簡(jiǎn)短的回答,有一個(gè)很大的區(qū)別:
#define ADD( a , b ) a * b
和
#define ADD( a , b ) ( a ) * ( a )
- 2 回答
- 0 關(guān)注
- 536 瀏覽
添加回答
舉報(bào)