i ++和++ i之间的区别?

时间:2015-05-02 05:13:42

标签: c short-circuiting

这是我的代码:

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

现在我的问题是,如果++i3,那么为什么++j是2?

++i&之间有什么区别? i++?另外,我想知道d 1是如何来的?

3 个答案:

答案 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;  

Short Circuit evaluation

答案 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:)