为什么这个If语句即使在条件为假的情况下也会执行?

use*_*508 3 c macros

#include<stdio.h>

int main()    
{    
    // We use a trick involving exclusive-or to swap two variables
    #define SWAP(a, b)  a ^= b; b ^= a; a ^= b; 

    int x = 10;
    int y = 5;
    printf("%d%d\n",x,y );

    if(x < 0)
        SWAP(x, y);

    printf("%d%d",x,y );

    return 0;     
}
Run Code Online (Sandbox Code Playgroud)

输出是:

105
515
Run Code Online (Sandbox Code Playgroud)

即使条件在if(10 <0为假)中评估为假,这个5 15即将到来?

And*_*mas 9

您的SWAP宏调用将被预处理器替换.尽管它出现在一行中,但只有第一个语句是语句的一部分if.

if(x < 0)
    SWAP(x, y);
Run Code Online (Sandbox Code Playgroud)

由预处理器转换为:

if(x < 0)
    a ^= b; b ^= a; a ^= b; ;
Run Code Online (Sandbox Code Playgroud)

这实际上与:

if(x < 0)
    a ^= b; 
b ^= a; 
a ^= b;
; 
Run Code Online (Sandbox Code Playgroud)

您可以通过将宏定义中的所有语句放入块中来解决此问题,如下所示:

#define SWAP(a, b)  do { a ^= b; b ^= a; a ^= b; } while( 0 )
Run Code Online (Sandbox Code Playgroud)

do/while技巧允许您使用分号跟随SWAP调用.