printf中使用的关系运算符的输出行为 - C语言

时间:2014-06-19 10:28:27

标签: c

这是我正在尝试的代码:

#include <stdio.h>
main(){
    int k = 35;
    int x = (k==35);
    printf("%d %d %d %d", (k==35), k=50, (k>40), x); // gives output => 0 50 0 1
    printf("\n%s",k==35); // gives output => (null)
    return 0;
}

我想知道关系检查会返回布尔truefalse。即使转换为整数类型,它也应该0false1true。我错过了什么?

3 个答案:

答案 0 :(得分:3)

实际上,k=50只有一个=分配运算符;因为它出现在一个参数列表中,所以参数的评估顺序是不确定的,你会被undefined behavior卡住。

编译器可以在执行(k>40)

之前或之后自由传递k=50

BTW,在Debian / Sid上使用GCC版本4.9,在使用

编译代码时
gcc -Wall danglingcruze.c -o danglingcruze

我被编译器警告:

danglingcruze.c:2:1: warning: return type defaults to ‘int’ [-Wreturn-type]
 main(){
 ^
danglingcruze.c: In function ‘main’:
danglingcruze.c:5:37: warning: operation on ‘k’ may be undefined [-Wsequence-point]
     printf("%d %d %d %d", (k==35), k=50, (k>40), x); // gives output => 0 50 0 1
                                     ^
danglingcruze.c:5:37: warning: operation on ‘k’ may be undefined [-Wsequence-point]
danglingcruze.c:6:5: warning: format ‘%s’ expects argument of type ‘char *’, 
        but argument 2 has type ‘int’ [-Wformat=]
     printf("\n%s",k==35); // gives output => (null)
     ^

答案 1 :(得分:2)

无法保证函数中参数的评估顺序。您正在修改其中一个参数中的k并在其他参数中使用其值。这就是它调用未定义行为的原因。类似案例

的一个例子
int i = 1;
printf("%d %d\n", i++, ++i); // Undefined behavior.

答案 2 :(得分:0)

#include <stdio.h>
main(){
    int k = 35;
    int x = (k==35); // x =1
    printf("%d %d %d %d", (k==35), k=50, (k>40), x); // gives output => 0 50 0 1
    // k=50 changed your value
    printf("\n%s",k==35); // gives output => (null)
    // => printf %s + 0 => null 
    return 0;
}