为什么没有增加(++ i || ++ j)

时间:2018-03-27 20:15:26

标签: c logic pre-increment

我不理解此代码的输出:

 long i=5, j=10;
 if (++i || ++j)  printf("%ld  %ld\n", i, j);
 else  printf("Prog1\n");

输出为6和10.我预计6和11.为什么j没有增加?

3 个答案:

答案 0 :(得分:8)

逻辑OR运算符||short circut operator。这意味着如果只能通过查看左操作数来确定结果,则不会评估右操作数。

关于逻辑OR运算符的C standard的第6.5.14节说明了以下内容:

  

4 与按位|运算符不同,||运算符保证   从左到右的评价;如果评估第二个操作数,则有   第一个和第二个的评估之间的序列点   操作数。 如果第一个操作数比较不等于0,则第二个操作数   操作数未被评估。

在这种情况下,计算++i并且结果为6(具有递增i的副作用。如果任一操作数不为零,则逻辑OR运算符求值为1(即为真)。由于左侧不为零,因此不评估右侧,随后j不会递增。

答案 1 :(得分:2)

您的if条件使用短路的逻辑OR运算符||。由于运算符(++i)的左侧评估为true,因此右侧(++j)不会执行。

答案 2 :(得分:0)

++i语句中仅执行了if,因为++i不为零且已被视为true。由于|| OR操作,无需执行++j