编辑:此问题并非重复,因为在这种情况下行为未定义。
为什么下面的程序在第一行中将输出打印为231?
对此我有两个疑问:
当我做后缀增量时,在调用max函数之前不应增加x的值。因此输出应该是第一位的,而不是我认为的2位。我想念什么?
#define prn(a) printf("%d",a)
#define print(a,b,c) prn(a), prn(b), prn(c)
#define max(a,b) (a<b)? b:a
main()
{
int x=1, y=1;
print(max(x++,y),x,y);
printf("\n");
print(max(x++,y),x,y);
}
输出:
231
451
后缀操作是否在执行语句后发生?请看下面的例子。
int main()
{
int x = 0, y = 1;
int a = x++ /*x is incremented hereafter?*/+ y; // line 1
/* Or x is incremented now after execution of above line?*/ // line 2
int b = 0;
}
答案 0 :(得分:3)
让我走这行
print(max(x++,y),x,y);
需要注意的重要一点是C预处理程序是一个宏预处理程序(允许您定义宏),可以在编译程序之前对其进行转换。这些转换可以包括头文件,宏扩展等。
所有预处理指令均以#符号开头。例如,
#define PI 3.14
告诉编译器将PI值替换为3.14。
c source code->preprocessor->compiler
因此print(max(x ++,y),x,y)在宏中扩展为
1. prn((x++<y) ? y:x++), prn(x), prn(y)
2. printf("%d",(x++<y)? y:x++), printf("%d",x), printf("%d",y);.
在这里进行处理,您可以在这里仔细检查两件事
边查看
x++<y ,the x++ value is 1
然后x的值变为2
所以打印了2张
然后在打印时我们也写了x ++,这意味着x ++ VALUE是2,但
之后,x值为3
所以打印了3,它跟随y为1
工作原理
2.To给您关于增量前和增量后的直观认识
让我举个例子
int x=2;//value of x is 2
x++;//here x++ value is 2
此行执行后x值更改为3
++x//here x++ value is 4 and also x value is 4.