这是我正在尝试的代码:
#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;
}
我想知道关系检查会返回布尔true
或false
。即使转换为整数类型,它也应该0
为false
,1
为true
。我错过了什么?
答案 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;
}