我写了以下c代码
代码1
#include <stdio.h>
int main() {
int z = 9;
printf("%d\n", printf("%d%d", scanf("%d", &z), z));
return 0;
}
代码2
#include <stdio.h>
int main() {
int z = 9;
printf("%d\n", printf("%d%d", z, scanf("%d", &z)));
return 0;
}
对于它们两个,我输入了 2 个输入“1”和“a”来查看输出如何变化。结果如下:
输入 | 代码1 | 代码2 |
---|---|---|
1 | 192 | 112 |
a | 092 | 902 |
据说
C
中参数的求值顺序是未指定的,但是是什么导致了这种行为呢?我还尝试过使用超过 1 个变量和所有可能的订单。
在我看来,评估是从右到左的。我可能是错的,只是想知道它是如何完成的。
据说C中参数的求值顺序是未指定的
这是正确的。它们可以按实现选择的任何顺序进行评估。因此,您不应编写依赖于以任何特定顺序求值的函数参数的代码。
虽然此代码表现出未指定的行为,但它“不”表现出未定义的行为。这是因为调用 scanf
的参数的计算包含调用函数时的序列点(以及函数内部的每个语句),因此
z
不会在没有序列的情况下被读写点。如果你这样做:
int rval = scanf("%d", &z);
printf("%d\n", printf("%d%d", rval, z));
它将打印读取的项目数和读入的值(假设实际上已读入),以供内部调用
printf
。