【问题标题】:Result of double postincrementation - in if statement and its body双后增量的结果 - 在 if 语句及其正文中
【发布时间】:2017-01-07 07:35:00
【问题描述】:

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

int i = 0;
if(i++) i++;
printf("%d", i);

我的意思是,在检查 if 语句时,i 必须递增,否则结果不会为 1。但是随着它的递增,应该再次递增,结果为 2。

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

int i = 0;
if(++i || i++) i++;

还有这个

int i = 0;
if(++i && i++) i++;

返回 3。

【问题讨论】:

  • C11 标准草案 n1570:6.5.2.4 后缀递增和递减运算符 2 后缀 ++ 运算符的结果是操作数的值。[...]结果在更新操作数的存储值的副作用之前排序。
  • i++result为0,所以if()不被占用。
  • 后缀形式在计算表达式后递增存储在变量中的值,因此您在 if() 中有 0 作为测试表达式
  • 后增量表示条件检查后增量。将 cout
  • 在 if 语句中,i 的值在 递增之前被检查,这就是后缀 ++ 的意思。值是否仍然为零,然后转到 1 则不执行 if 之后的语句,因为 if 条件为零=false。

标签: c if-statement post-increment


【解决方案1】:
  • 代码行if(i++) 在递增之前检查i 的值。因此,自 i=0 以来检查失败,检查后,i 将在离开 if 条件使其等于 1 之前递增。
  • 但是if(++i || i++) 通过,因为++i 在检查条件之前被评估,结果为1,条件为真,然后i++ 为2。
  • 此外,由于 ++i 将为 1,而 i++ 也仍为 1,因为 i 在其递增之前将首先使用。所以 1 && 1 为真,然后在离开条件之前,i 将递增到 2,并且 if 下方的行将被评估为 3,并且 i 的新值将为 3。

【讨论】:

  • 但是当我有 if(++i && i++) i++; 时,结果是 3。
  • @Liseł:为了更有趣,if(++i && --i) i++; 会产生什么结果?
  • @CecilWard 当涉及到第一部分时,您可以依赖第二部分不被评估。例如if(n >= 0 && array[n] == 42)。除非第一部分是true,否则第二部分无法进行评估。
  • @EOF: "为了更有趣,if(++i && --i) i++; 会导致什么结果?" -- 代码审查失败。
  • 请孩子们,不要写这样的代码,不要要求其他维护者经常查看标准的细节。通过将大量内容塞进单个复杂的 if 语句或将副作用放入测试中,您不会生成更好或更差的代码。
猜你喜欢
  • 2023-03-05
  • 1970-01-01
  • 2013-10-18
  • 2017-09-06
  • 1970-01-01
  • 1970-01-01
  • 2021-04-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多