此预处理器指令C/C++需要说明

Ros*_*han 1 c c++

我试图在一些测试中解决这个问题,但后来当我在家里运行时,它给出了意想不到的答案.我无法理解这段代码:

#include <stdio.h>
#include <conio.h>
#define swap(a,b) temp=a; a=b; b=temp;
int main()
{
int i, j, temp;
i=5;
j=10;
temp=0;
if( i > j) //evaluates to false
swap( i, j );
printf( "%d %d %d", i, j, temp); //expected output: 5 10 0
getch();
return 0;
}
Run Code Online (Sandbox Code Playgroud)

我得到的输出是:10 0 0

请有人解释它是如何工作的.

Moh*_*ain 11

代码如下

if( i > j) //evaluates to false
swap( i, j );
Run Code Online (Sandbox Code Playgroud)

if( i > j) //evaluates to false
temp=i; i=j; j=temp;
Run Code Online (Sandbox Code Playgroud)

这相当于

if( i > j) //evaluates to false
{temp=i;} i=j; j=temp;
Run Code Online (Sandbox Code Playgroud)

如果条件为假,则会出现如下意外结果

i=5;
j=10;
temp=0;
i=j;  /* i becomes 10 */
j=temp; /* j becomes 0 */
Run Code Online (Sandbox Code Playgroud)

学习收获

  1. 尝试将块(如果,其他,for,do,while)放入其中 {}
  2. 避免使用宏,更喜欢功能
  3. 如果必须使用宏,请使用安全宏,例如:

#define swap(a,b) do { temp=a; a=b; b=temp; } while(0)

请注意,while(0)之后没有终止分号

  • @Jerry101无论swap是宏还是函数,该行都会产生未定义的行为...... (2认同)