c语言奇怪的问题

来源:百度知道 编辑:UC知道 时间:2024/04/30 21:38:59
#include <stdio.h>
#define MAX(a,b) ((a)>(b)?(a):(b))
void main()
{
int a=1,b=0;
MAX(a++,b);
}

谁能告诉我在单步执行的时候,为什么执行到MAX(a++,b);的时候a的值为3呢?不应该是2吗?

当MAX(a++,b); 的时候,((a)>(b)?(a):(b))
变成,((a++)>(b)?(a++):(b)).

((a++)>(b)中的a++使a变成了2.即2>0吗?若2>0,则执行a++,即2++,那不就是3了吗?

这样明白了吗?如果还不明白就这么理解这个问题:((a++)>(b)?(a++):(b))可以理解成
if ((a++)>b)
a = a++;

既然((a++)>(b)中的a现在是2,那么执行a = a++;语句之后,a的值不就是3了吗?

因为宏替换时,所有的a都会被替换为a++,

a++>b?a++:b

这是实际的执行语句,整个条件表达式要执行两次a++,所以执行过后,a的值就是3

因为宏替换时,所有的a都会被替换为a++,
就相当于a++>b?a++:b
这样的话a就自加了2次
所以是3

对不起啊,我就知道宏分带参数的和不带参数的
现在就在就在就知道这么多啊~

呵呵我也是新学的啊~~
共同进步吧~~

#include <stdio.h>
#define MAX(a,b) ((a)>(b)?(a):(b))-->宏定义
void main()
{
int a=1,b=0;
MAX(a++,b); --->运行这个时需要进行宏替换;即宏里的a都被替换成a++
}
实际上就是:(a++)>b?(a++):b

运算就是:2>0?(a++):b--->2>0成立,取(a++)的值为整个表达式的值.而此时的a的值经过(a++)运算已经改变,所以运行到MAX(a++,b)时 a=3.