【问题标题】:Logical Operators and increment operators [duplicate]逻辑运算符和增量运算符 [重复]
【发布时间】:2018-09-03 15:40:52
【问题描述】:

谁能解释一下这段代码?如何将值仅分配给变量 m 但输出是针对所有变量更改的。这里还有逻辑运算符和增量运算符的作用。

#include <stdio.h>

#include <stdlib.h>
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; 
}

【问题讨论】:

  • 请记住,逻辑运算符执行short-circuit evaluation,并且任何非零值都被视为真。
  • 此代码中没有位运算符。而且您似乎不明白前缀增量运算符的作用?
  • 你期待什么?哪里有问题?您是否阅读过逻辑运算符并知道前/后增量是如何工作的?什么与您的教科书或其他可靠的文档相矛盾?
  • 不相关:函数声明器中的空括号是一个过时的特性,并且在该语言的进一步版本中将被删除。不要习惯这种不好的做法。我们使用适当的原型样式声明器,即int main(void)。当然,这适用于所有函数声明(包括定义)。

标签: c logical-operators


【解决方案1】:

|| 或逻辑 OR 运算符具有 short-circuit property。它只评估了 RHS 是 LHS 是 FALSY。

在您的情况下,++x 的评估产生-2 的值,它不是 FALSY (0)。因此,永远不会评估 RHS。

分解:

m = ++i || ++j && ++k; 

 >> m = (++i) || (++j && ++k);
     >> m = (-2) || (++j && ++k);
        >> m = 1   // -2 != 0 

因此,只有 mi 的值被更改,其余变量将保留它们的值(因为它们没有被评估)。

也就是说,逻辑或运算符的结果是01,一个整数值。结果存储在m,在您的情况下。

【讨论】:

  • 我觉得他问的不是这个。他在问为什么只有 m 被重新分配,但每个变量都发生了变化。
  • @sagi 但是,每个变量都没有改变!!
  • 是的@sagi这是我的疑问
  • 能否详细解释一下
  • 我的错,应该从一开始就检查。
猜你喜欢
  • 2015-04-17
  • 2013-04-03
  • 2015-09-20
  • 1970-01-01
  • 2017-06-30
  • 1970-01-01
  • 2019-04-21
  • 2011-03-14
  • 2020-10-02
相关资源
最近更新 更多