如何生成以下输出?

时间:2014-01-04 11:15:40

标签: c

我似乎遇到以下代码生成输出的问题:

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。有谁可以解释这背后的原因?

4 个答案:

答案 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);

因为对这些参数的评估可能并不总是按照您声明的顺序进行。