为什么使用C ++ GCCv7.1.1编译器输出此代码10,0,0?

时间:2017-09-23 08:54:41

标签: c++

#include <iostream>
# define swap(a,b) temp=a; a=b; b=temp;

using namespace std;
int main( )
{
    int i, j, temp;
    i=5;
    j=10;
    temp=0;
    if( i > j)
       swap( i, j );
    cout << i <<" ";
    cout <<j << " "<< temp;
    return 0;
}

2 个答案:

答案 0 :(得分:1)

原因是宏直接修改了源代码。

if( i > j)
   swap( i, j );
cout << i <<" ";

因此成为

if (i > j)
    temp = i;
i = j;
j = temp;
cout << i <<" ";

我使用缩进来强调语句i = j;j = temp;是否已执行,无论是i > j还是#define swap(a,b) do {temp=a; a=b; b=temp;} while (0) 。任何C ++(和C)编译器(或预处理器)都会发生这种情况 - 它不是特定于gcc。

如果必须使用宏,则需要在这种用例中使宏正常工作。例如;

if (i > j) swap(i, j);

确保所有三个作业一起发生,即使在像

这样的情况下也是如此
if (i > j) std::swap(i, j);

实际上,在C ++中主动不鼓励使用宏,因为有更好的替代方法,例如使用标准库

std::swap()

其中<algorithm>在标准标题<utility>(C ++ 11之前)或inline(C ++ 11及更高版本)中可用。

如果您真的坚持编写自己的代码而不是使用标准库,请为此目的编写函数,而不是宏。根据需要,该函数可以写为{{1}}函数或模板化。

答案 1 :(得分:0)

问题在于,当您编译代码时,宏将被其定义替换。所以你的代码是becones:

geom_bar(stat = "identity", fill = ifelse(temp$Max_WS > 10, "black", "grey"))

由于交换调用周围没有{},因此只有交换的第一部分(即if(i > j) temp=i; i=j; j=temp; )是if的一部分。每次执行接下来的两个命令。正确的方法是:

temp=i