#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;
}
答案 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