C 这两种说法有什么区别?

C 这两种说法有什么区别?,c,C,第一句话: int a = 5; int b = 6; int c; c = a > b ? 1 : 0; 第二句话: int a = 5; int b = 6; int c; c = a > b ? 1 : 0; 上面两个语句的区别是什么?这两个语句都是相等的,因为在C语言中没有布尔值的概念。因此,true表示为1,false表示为0 请参阅第一部分中的a>b?1:0,将整数值1或0分配给变量c 在第二个变量中,(a>b),将比较的布尔结果分配给变量c 语义上有很大的区别,

第一句话:

int a = 5;
int b = 6;
int c;
c = a > b ? 1 : 0;
第二句话:

int a = 5;
int b = 6;
int c;
c = a > b ? 1 : 0;

上面两个语句的区别是什么?

这两个语句都是相等的,因为在C语言中没有布尔值的概念。因此,
true
表示为1,
false
表示为0


请参阅第一部分中的
a>b?1:0
,将整数值
1
0
分配给变量
c

在第二个变量中,
(a>b)
,将比较的布尔结果分配给变量
c


语义上有很大的区别,在现实世界中根本没有区别,因为在C中,true的值是
1
,false的值是
0
。因此,
c
将获得值
1
0

不同之处在于执行,而不是结果。一种类似C的语言,广泛用于嵌入式系统;执行是一个重要的考虑因素

在语句1中,将对表达式
a>b
的结果进行评估,并根据该结果的输出将一个值分配给变量
c
。在第二种情况下,表达式
a>b
的输出直接赋值

执行方面的第二条语句更为优化。第一个语句是基于决策的,而第二个语句是简单的赋值。它不需要提及,但在语句1的情况下,您有更大的灵活性,因为除了分配1和0之外,您还可以用它做更多的事情


从硬件的角度来看,在正常的编译器上运行语句1比语句2需要更多的周期,这绝对没有区别(除了第一个有更多的击键,第二个有不必要的括号
(…)
)。在一些非常糟糕的优化编译器上,一种形式或另一种形式可能会更慢

x>y
的真结果表示为
1
,假结果表示为
0
。引用ISO/IEC 9899:201x委员会草案2011年4月12日N1570:

如果指定的关系为,则每个运算符
(小于),code>(大于),
=
(大于或等于)应产生
1
,如果指定的关系为,则产生
0
) 结果的类型为
int

a?b:c
是一个表达式,如果
a
的计算结果为true,则给出值
b
否则
c

因此,从结果来看,这两个参数是相同的。实际上,如果您编译并反汇编此代码,您会注意到编译后的代码可能也没有什么不同:

c = (a > b);
在GCC 4.7.2 x86-64上编译,并在
-g
)上进行调试-这应确保尽可能禁用所有优化-然后使用
objdump-d foo.o
进行反汇编:

int test1(int a, int b) {
    return a > b;
}

int test2(int a, int b){
    return a > b ? 1 : 0;
}

第一个将
b
a
进行比较,并适当设置处理器标志。第二个设置将
al
(寄存器eax/rax的最低字节)设置为1,如果结果为“更大”(注意,比较倒过来!),否则设置为0;第三个,
movzbl
0将一个字节扩展为32位整数,因为我们在这里返回一个
int

实际上,
false
用0表示,但其他所有内容都表示
true
。所以,-3、0.5和
'0'
都是真的。@AustinWBryan当
-3
0.5
'0'
等值被认为是真的(或者更确切地说是非假的)时,布尔表达式的结果总是
0
1
。我知道。我只是希望其他值表示
true
,因为这缺少信息。C语言有布尔的概念(
\u Bool
),但是>的结果是
int
,并且
1
0
C都有布尔的概念。比较产生一个布尔结果,由值为
1
0
int
表示。布尔逻辑只是指二进制逻辑;表示形式不是隐含的(其他语言如何表示“真”和“假”?Python例如使用对象)。如果不使用非常糟糕的编译器,执行过程没有区别。是的,但我们不是在讨论编译器优化。这更像是一个概念性的问题,而不是一个应该指出的编程和差异。我就是这么做的。其他要点很明显,USC没有定义
?:被执行。若它确实定义了一些执行模型,那个么我就不会从非优化编译器过程中得到完全相同的代码了。非常感谢。我没有意识到这一点。我没想到我会从这个问题中学到什么我的意思是当然编译器可以编译
?:
转换成一系列的跳转,但你不能从代码本身来推理。出于非“编译器”专家的好奇心,你能解释一下第一条语句在什么情况下可能比第二条语句更快吗?我知道第二个可能更快,但看不出第一个怎么可能+1.嗯,这确实是一个很糟糕的编译器。这只是理论上的,但是如果您需要在某个体系结构上为
?:
发生跳转,那么您也需要为
发生跳转,以便正确设置1或0。因此,跳转的顺序可能不同,并导致分支预测失败。我的观点是,对从C源代码生成的代码做这样的陈述是非常大胆的。