这是我的代码:
int main()
{
int i=2,j=2,c=2,d;
d= ++i || ++j && c;
printf("I is %d\n",i);
printf("J is %d\n",j);
printf("C is %d\n",c);
printf("D is %d\n",d);
return 0;
}
以下代码的输出是:
i is 3
j is 2
c is 2
d is 1
现在我的问题是,如果++i
是3
,那么为什么++j
是2?
++i
&之间有什么区别? i++
?另外,我想知道d
1
是如何来的?
答案 0 :(得分:7)
你问:
现在我的问题是如果++ i是3那么为什么++ j是2?
++j
永远不会执行,因为++i
评估为真。
由于运算符优先级,表达式++i || ++j && c
相当于++i || (++j && c)
。
运行时从左到右评估表达式++i || ++j && c
第一个词++i
评估为3
,副作用是i
的值为3
。由于它不为零,因此运行时不需要在此之后评估任何内容。由于永远不会评估++j
,因此j
的值不会更改。
++i
&之间有什么区别?i++
?
表达式++i
的值为i+1
,副作用是i
的值增加1
。
表达式i++
的值为i
,副作用是i
的值增加1
。
int i = 2;
int x = ++i; // x == 3, i == 3 at the end of execution of the statement
int y = i++; // y == 3, i == 4 at the end of execution of the statement
我想知道D的结果是1
d
的值设置为1,因为表达式的布尔值为true
。
答案 1 :(得分:5)
++我是预增量
i ++是后增量
假设i = 2
In Post In crement
printf("%d",i++); // it will print output 2 then increment value of i to 3
在预增量中
printf("%d",++i); //first it will increment value of i to 3, then print output 3
d= ++i || ++j && c;
将以这种方式执行条件++i || (++j && c);
当i = 2时,++i
之后它将变为3
在 OR 中如果第一个条件为真,它将跳过第二个条件。表示不会执行++j && c
++i || ++j && c
的结果为1
所以d = 1。
printf("I is %d\n",i); // i = 3;
printf("J is %d\n",j); // j = 2;
printf("C is %d\n",c); // c = 2;
printf("D is %d\n",d); // d = 1;
答案 2 :(得分:0)
评估的原因是布尔运算符&&
和||
的短路。
&&
,如果左侧表达式为false,则组合结果为false(从不评估右侧表达式)。||
,如果左侧表达式为true,则组合结果为true(右侧表达式从不评估)。当右手表达具有副作用时,这一点非常重要,例如更改值(或调用某些具有副作用的函数),例如在您的情况下:
d= ++i || ++j && c;
请注意,由于i
左侧的条件表达式为真,因此组合条件表达式会将1
增加||
,即右侧的条件表达式,即{{}永远不会评估1}}。
因此,总表达式最终会导致:
++j && c
解释为什么d = 1?
现在,如果您更改d = 1 || ++j && c;
的值,则会执行i=-1
右侧的表达式,||
将根据您的预期递增
现在,对于i ++ vs ++的性能影响,我检查here:)