我坚持遵循c编程,没有代码概念

Har*_*mar -2 c

# 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)

Som*_*ude 8

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语句的一部分时引起问题.

  • 感谢不要忽视`j = temp ;;`.:-) (2认同)
  • @Quentin公平点...但这就是内联函数优于宏的原因之一; 但这是一个不同的故事. (2认同)