C 为什么是;如果(i+;+;&;(i==1))“;false,其中i是一个整数,值为1?

C 为什么是;如果(i+;+;&;(i==1))“;false,其中i是一个整数,值为1?,c,if-statement,logical-operators,C,If Statement,Logical Operators,根据我的理解,在if条件中,首先计算表达式(i==1),该表达式应返回1,然后在逻辑上与1进行and运算,该值为i,因此表达式应返回1&&1==1,但是执行else部分 有人能解释一下为什么要执行其他部分吗?没有。在C语言中,&&操作符的LHS求值和RHS求值之间有一个平衡点,在RHS求值之前必须进行并完成增量。因此,执行i++(相当于i++!=0)并完成增量(表达式的计算结果为true),因此在计算RHS时,i==2,因此整个表达式为false,并打印“否”。如果&运算符的LHS计算为fals

根据我的理解,在
if
条件中,首先计算表达式(
i==1
),该表达式应返回
1
,然后在逻辑上与
1
进行and运算,该值为
i
,因此表达式应返回
1&&1==1
,但是执行
else
部分

有人能解释一下为什么要执行
其他部分吗?

没有。在C语言中,
&&
操作符的LHS求值和RHS求值之间有一个平衡点,在RHS求值之前必须进行并完成增量。因此,执行
i++
(相当于
i++!=0
)并完成增量(表达式的计算结果为true),因此在计算RHS时,
i==2
,因此整个表达式为false,并打印“否”。如果
&
运算符的LHS计算为false(0),则由于
&&
运算符的“短路”特性,将不会计算RHS

只有少数运算符具有在LHS和RHS求值之间具有序列点的属性:
&
|
,和
(作为运算符,而不是参数列表中的分隔符)-还有
也是,它不是二进制运算符,但在计算条件之后,在计算
后的表达式或
后的表达式之前,有一个序列点(其中一个或另一个,但不是两个,总是计算)

&&
|
运算符是唯一具有“短路”属性的运算符。只有当LHS的计算结果为true时,才会计算
&&
的RHS;只有当LHS的计算结果为false时,才会计算
|
的RHS


关于序列点的澄清 正确地说:

C11标准没有消除序列点,只有C++11标准消除了序列点

C++11(ISO/IEC 14882:2011)规定:

1.9程序执行

¨13 Sequenced before是由单个 线程(1.10),这会在这些计算中产生偏序。给定任意两个评估A和B,如果 A在B之前排序,则A的执行应先于B的执行。如果A在B之前未排序 B和B在A之前未排序,则A和B未排序。[注:执行未排序的 评估可能重叠。-结束注释]评估A和B的顺序不确定 在B之前排序,或B在A之前排序,但未指定是哪个。[注:不确定 顺序计算不能重叠,但可以先执行任何一个。-结束注释]

术语“序列点”在C++11中根本没有出现(唯一接近匹配的是“序列指针”)

C11(ISO/IEC 9899:2011)规定:

5.1.2.3程序执行

^3之前排序的是评价之间的不对称、传递、成对关系 由单个线程执行,这会导致这些计算之间的偏序。 给定任意两个评估A和B,如果A在B之前排序,则A的执行 应在执行B之前。(相反,如果A在B之前排序,则B为 如果A未在B之前或之后排序,则A和B为 不连续的。对A进行排序时,评估A和B的排序不确定 在B之前或之后,但未指定哪个。13)序列点的存在 在表达式A和B的求值之间,意味着每个值的计算 与A相关的副作用在每次计算值和副作用之前排序 与B相关。(附录C中给出了序列点的摘要。)

13) 未排序的求值的执行可以交错进行。不确定序列评估 不能交错,但可以按任何顺序执行


因此,C11确实保留了序列点,但添加了“sequenced before”和使用与C++11基本相同的术语的相关术语。

当在表达式中使用
&&
时,其参数保证从左到右计算。因此,当计算
(i==1)
时,
i
将具有
2
的值。因此,表达式为false,将执行
else
部分


但是,为完整起见,请注意,如果左参数的计算结果为false或0,则根本不计算右参数。

这里有一个简单的解释


这就是为什么这个条件变为“false”

您会感到困惑,因为循环内语句i++用于后期增量。 e、 g


for(i=0;i我认为1&&1=1和1&&0=0对您来说是清楚的。
迈克尔L的答案对我来说似乎不错,但我还是会尝试详细说明一下。
以下是提供运算符优先级列表的链接:

如果您访问此链接并参考该表,您将知道&&具有从左到右的关联性。因此,首先,在左部分之后,我将变为2(Sruit尝试使用图表显示此内容);然后,对于右部分,我==1检查已完成。我们可以通过编写如下所示的代码来检查这一点:

这段代码解释了当执行流达到i==1部分时,i=2

for (i=0;i<1;i++)
#包括
int main(){
int i=1;
if(i++&(printf(“%d\n”,i)))
printf(“是\n”);
其他的
printf(“否”);
返回0;
}
因此,输出为:

二,

所以2==1被证明是错误的,最终答案会给人一种令人惊讶的感觉!!! 右侧括号表示0,左侧括号表示1,因此1&&0=0。 我认为这是公平的,我们可以接受
for (i=0;i<1;i++)
#include <stdio.h>
int main() {
    
    int i = 1;
    if (i++ && (printf("%d\n",i)))
        printf("Yes\n");
    else
        printf("No\n");
    return 0;
}