【问题标题】:Not understanding the line of statement [duplicate]不理解语句[重复]
【发布时间】:2018-11-26 07:45:02
【问题描述】:

这里是代码

int main()
{
    int i=-3, j=2, k=0, m;
     m = ++i||++j&&++k;
     printf("%d, %d, %d, %d\n", i, j, k, m);
     return 0;
}

然后输出: -2, 2, 0, 1

但我不明白m = ++i||++j&&++k; 是如何执行的。 有人请解释..谢谢!

【问题讨论】:

  • 但是 m 是如何增加的呢?
  • ||&& 是逻辑运算符。它们的结果将始终为10,具体取决于表达式的计算结果是非零值还是零值。所以你基本上有这样的东西:if ((++i != 0) || (++j != 0) && (++k != 0)) { m = 1; } else { m = 0; }.
  • 我希望您知道,没有人会在现实世界的程序中真正编写这样的代码。

标签: c


【解决方案1】:

最初你有 4 个变量:

  • i = -3
  • j = 2
  • k = 0
  • m 未初始化

m = ++i||++j&&++k; 从左到右执行。所以第一个是++i - 我建议阅读differences between i++ and ++i - 在这种情况下,i 增加 1 并变为 i=-2

-2 是 true 表达式,因此 m 变为 1 并且不计算表达式的其余部分。因为无论如何true or anything else 总是正确的。 所以最终结果:

  • i = -2(增加)
  • j = 2(不变)
  • k = 0(不变)
  • m 为 1(真)

【讨论】:

  • 我会修复的。我习惯了 javascript :)
【解决方案2】:

逻辑OR 操作(expr1 || expr2) 采用short-circuiting 行为。也就是说,如果expr1 是逻辑1 (true),则不会评估expr2

如果两个操作数中的任何一个不为零,则具有逻辑 OR 运算符的表达式的计算结果为 true

在这个表达式中:

m = ++i||++j&&++k;
    |_|  |______|
    LHS    RHS

i 被初始化为 -3++i 将评估为 -2
-2 是一个非零值,因此评估为逻辑 true 并且不会评估表达式的 RHS 部分。

由于整个表达式计算为true,因此值1 被分配给m

【讨论】:

  • 您可以将评估顺序更明确地设置为m = (++i) || ((++j) && (++k));
猜你喜欢
  • 2019-11-03
  • 2019-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-08
  • 1970-01-01
  • 2021-07-13
  • 1970-01-01
相关资源
最近更新 更多