无法理解 C 程序的输出
Unable to understand the output of program in C
编辑:这个问题不是重复的,因为在这种情况下行为不是未定义的。
为什么下面的程序在第一行打印输出为 231?
对此我有两个疑惑:
因为我正在做后缀增量,所以在我调用 max 函数之前不应该增加 x 的值。所以根据我的说法,输出应该首先是 1 而不是 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;
}
让我走这条线
print(max(x++,y),x,y);
需要注意的一个重点是 C 预处理器是一个宏预处理器(允许您定义宏),它在编译之前转换您的程序。这些转换可以包括头文件、宏扩展等。
所有预处理指令都以# 符号开头。例如,
#define PI 3.14
告诉编译器在它看到的地方用 3.14 替换值 PI。
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 IS 2 但是
之后 x 值为 3
所以 3 被打印出来,它在 y 之后是 1
这就是它的工作原理
2.TO 给你一个很好的预增量直觉和 post 增量
举个例子
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.
编辑:这个问题不是重复的,因为在这种情况下行为不是未定义的。
为什么下面的程序在第一行打印输出为 231?
对此我有两个疑惑:
因为我正在做后缀增量,所以在我调用 max 函数之前不应该增加 x 的值。所以根据我的说法,输出应该首先是 1 而不是 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; }
让我走这条线
print(max(x++,y),x,y);
需要注意的一个重点是 C 预处理器是一个宏预处理器(允许您定义宏),它在编译之前转换您的程序。这些转换可以包括头文件、宏扩展等。
所有预处理指令都以# 符号开头。例如,
#define PI 3.14
告诉编译器在它看到的地方用 3.14 替换值 PI。
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 IS 2 但是
之后 x 值为 3
所以 3 被打印出来,它在 y 之后是 1
这就是它的工作原理
2.TO 给你一个很好的预增量直觉和 post 增量
举个例子
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.