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;
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)
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.