# define swap(a,b) temp=a; a=b; b=temp;
main( )
{
int i, j, temp;
i=5;
j=10;
temp=0;
if( i > j)
swap( i, j );
printf( "%d %d %d", i, j, temp);
}
Run Code Online (Sandbox Code Playgroud)
执行上面的代码后,我得到意想不到的输出,我没有得到这背后的确切逻辑.所以请帮帮我.
上述代码的输出:
10 0 0
Run Code Online (Sandbox Code Playgroud)
宏swap不是C函数,而不是预处理器插入宏作为是在宏调用的地方,所以代码如下所示:
if( i > j)
temp=i; i=j; j=temp;;
Run Code Online (Sandbox Code Playgroud)
重新格式化代码后
if( i > j)
temp=i;
i=j;
j=temp;
;
Run Code Online (Sandbox Code Playgroud)
只有分配temp完成,如果条件为真,其他两个任务都始终做到无条件.
这可以通过两种方式解决:将宏调用放在语句块中:
if( i > j)
{
swap( i, j );
}
Run Code Online (Sandbox Code Playgroud)
或者将宏体块设为块:
#define swap(a,b) do { temp=(a); (a)=(b); (b)=temp; } while (0)
Run Code Online (Sandbox Code Playgroud)
将多语句宏放在do { ... } while (0)语句中的约定是因为否则你得到一个空语句(就像你现在看到的那样,见上文),这可能会在扩展宏作为例如if else语句的一部分时引起问题.