我似乎遇到以下代码生成输出的问题:
main()
{
int k = 35 ;
printf ( "\n%d %d %d", k == 35, k = 50, k > 40 ) ;
}
由于k
被初始化为35,因此第一个关系k==35
必须求值为true,因此非零值,也适用于第三个条件,作为k
的值已更改为50
,因此它也必须为true,同样为非零值,但在执行时,程序将输出设为0 50 0
。有谁可以解释这背后的原因?
答案 0 :(得分:4)
可以按任何顺序计算函数参数。您的编译器已选择从右到左评估参数,即
main()
{
int k = 35 ;
int result_first = (k > 40); // 0
int result_second = (k = 50); // 50
int result_third = (k == 35); // 0
printf ( "\n%d %d %d", result_third, result_second, result_first ) ;
}
答案 1 :(得分:3)
函数参数没有评估顺序。它是未指定的,编译器可以按任意顺序对其进行评估。
答案 2 :(得分:1)
not
中的参数始终会在left to right order
中进行评估。
因此,请避免编写输出不确定的代码。如果你想编写这样的程序,请使用三个不同的 printf()来打印所有三个参数。
答案 3 :(得分:1)
初始化值或更新printf语句中的值是一种不好的做法。
您可以改为使用其他几个变量并使用这些变量启动它们。
或者如果要打印它们,可以使用三个不同的printf
语句,如图所示
printf("%d ",k==35);
printf("%d ",k=50);
printf("%d\n",k>40);
因为对这些参数的评估可能并不总是按照您声明的顺序进行。