C if语句及其正文中双重后增量的结果

C if语句及其正文中双重后增量的结果,c,if-statement,post-increment,C,If Statement,Post Increment,有人能解释一下为什么这一行代码返回1吗 int i = 0; if(i++) i++; printf("%d", i); 我的意思是,当检查if语句I时,必须递增,否则结果不会是1。但是当它增加时,is应该再次增加,结果是2 更好的是,为什么这行代码会产生2 int i = 0; if(++i || i++) i++; 还有这个 int i = 0; if(++i && i++) i++; 返回3。 代码行if(i++)在递增之前检查i的值。因此检查失败,因为i=0,检查后

有人能解释一下为什么这一行代码返回1吗

int i = 0;
if(i++) i++;
printf("%d", i);
我的意思是,当检查if语句
I
时,必须递增,否则结果不会是1。但是当它增加时,is应该再次增加,结果是2

更好的是,为什么这行代码会产生2

int i = 0;
if(++i || i++) i++;
还有这个

int i = 0;
if(++i && i++) i++;
返回3。

  • 代码行
    if(i++)
    在递增之前检查
    i
    的值。因此检查失败,因为
    i=0
    ,检查后,
    i
    将在离开
    if
    条件之前递增,使其等于1
  • 但是
    如果(++i | | i++)
    通过,因为在检查条件之前对
    ++i
    求值,该条件求值为1,条件将为真,然后对
    i++
    求值,结果为2
  • 另外,由于++i将是1,而i++也仍然是1,因为我将在其递增之前首先使用。因此1&&1为真,然后在离开条件之前,i将增加到2,if下面的行也将计算为3,i的新值将为3

C11标准草案n1570:6.5.2.4后缀递增和递减运算符2后缀++运算符的结果是操作数的值。[…]在更新操作数存储值的副作用之前,对结果的值计算进行排序。
i++
的结果为0,因此
if()
不接受。后缀形式会在表达式求值后增加存储在变量中的值,因此在if()中有0作为测试表达式。后增量表示它在检查条件后增加。在if语句中放入cout之类的内容,在递增之前检查
i
的值,这就是postfix++的含义。如果值仍然为零,则转到1,则不会执行if后的语句,因为if条件为零=false。但是,当我有
if(++I&&I++)I++结果是3。@Liseł:为了更有趣,如果(++i&&--i)i++,
结果?@CecilWard当第二部分涉及第一部分时,您可以信赖第二部分未被评估。例如
如果(n>=0&&array[n]==42)
。除非第一部分是
true
@EOF:“为了更有趣,如果(++i&&--i)i++;
导致什么?“--失败的代码审查,第二部分就不能进行评估。”——请孩子们,不要这样写代码,不要要求其他维护人员经常查看标准的详细信息。通过将大量内容塞进单个复杂的if语句或将副作用放入测试中,您不会生成更好或更差的代码。