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

时间:2014-09-12 05:16:16

标签: 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;
}

我得到的输出是:10 0 0

请有人解释它是如何运作的。

2 个答案:

答案 0 :(得分:11)

以下代码

if( i > j) //evaluates to false
swap( i, j );

变为

if( i > j) //evaluates to false
temp=i; i=j; j=temp;

相当于

if( i > j) //evaluates to false
{temp=i;} i=j; j=temp;

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

i=5;
j=10;
temp=0;
i=j;  /* i becomes 10 */
j=temp; /* j becomes 0 */

<强>学习收获

  1. 尝试在{}
  2. 中放置块(if,else,for,do,while)
  3. 避免使用宏,更喜欢功能
  4. 如果必须使用宏,请使用安全宏,例如:
  5. #define swap(a,b) do { temp=a; a=b; b=temp; } while(0)

    请注意no terminating semicolon after while(0)

答案 1 :(得分:3)

扩展宏,你得到:

if (i > j)
   temp = i;
i = j;
j = temp;

这就是经验丰富的c程序员在do{...}while(0)中包装宏体的原因。

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