質問

So I have the following program:

# 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)
    swap(i, j);
printf("%d %d %d", i, j, temp);
}

This results in:

10, 0, 0

What I don't understand is why the if (5 > 10) condition was executed as "true" even though 5 is not bigger than 10.

役に立ちましたか?

解決

This should teach you to avoid macros if at all possible and always, always use braces in control flow statements.

After macro expansion, your code will read:

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

See the problem?

他のヒント

This is because at the time of compilation swap(i, j); is being replaced by temp=a; a=b; b=temp;. Now the expanded macro looks like

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

At the time of execution only temp = i will not execute for i > j to be false.
If you wanna treat swap(i, j) like a function, then change your macro definition to

#define swap(a,b) do {temp=a; a=b; b=temp;} while (0) 
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top