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;
}