我正在学习C语言,我试图理解为什么这个例子的输出是1 2 1 1
:
int main()
{
int a, b, c, d;
a = b = c = d = 1;
a = ++b > 1 || ++c > 1 && ++d > 1;
printf("%d%d%d%d", a, b, c, d);
}
||
之前的左操作数才会被评估,因为它是True,不需要评估正确的操作数。不评估右操作数。这是对的吗?++b > 1
等于1
(2大于1)和a = 1
。正确?答案 0 :(得分:2)
是的,你对两个帐户都是正确的。
需要注意的重要一点是,C标准保证了这种行为,通常称为short circuting。
相关:Is short-circuiting logical operators mandated? And evaluation order?
答案 1 :(得分:1)
||
的左侧评估为true
,因此不需要评估右侧。因此,c
和d
保持1
,b
增加到2
,a
被分配到true
,被提升为1
。
<强>解释强>
a = b = c = d = 1;
所有四个变量都等于1
。
a = ++b > 1
在评估剩余的RHS之前,变量b
会增加到2
。这导致表达式2 > 1
,这是真的。正如其他人所提到的那样,你的||
表达式然后被短路,这意味着||
之后的内容将不会被评估,因为程序已经知道整个RHS将会无论发生什么,都要成真。这就是为什么我甚至不打算写表达式++c > 1 && ++d > 1
,因为它会被跳过。
变量a
设置为true,与1
相同。
有关宣传int
Can I assume (bool)true == (int)1 for any C++ compiler?
答案 2 :(得分:1)
第一行a = b = c = d = 1
为所有变量分配1,因为赋值运算符(=)的关联性是从右到左。
下一步: 这里应用的概念称为短路。 &#39;&gt;&#39;的偏好除了增量运算符(++)之外,它高于所有其他运算符 - 前缀增量是精确的。
因此,第一个b增加到2.现在,2 > 1
的比较发生,这是真的或1。
OR的左操作数为真或1.因此,如果右操作数为true或false,则几乎没有区别,因为最终输出仍将返回true或1。
因此,OR(||)右边的所有内容都不会被评估。因此c和d不会增加并保持= 1。
a = True或1
因此a = 1, b = 2, c = d = 1
答案 3 :(得分:0)
OR运算符是逻辑运算符。 ||逻辑或。仅当任一操作数为true时为true。在第一行中,您通过a=b=c=d=1
将1分配给所有变量。
之后,您将比较a=++b>1
是否为真的条件,然后编译器将使用&& AND运算符检查++c>1 && ++d>1
的第二个条件,因此在这种情况下,如果两个方程式均正确,则命令将运行。