【问题标题】:Incremental Assignment增量分配
【发布时间】:2011-11-23 20:42:59
【问题描述】:

我已经使用 C++ 很多年了,但我才意识到增量分配的一些问题。

我有这个sn-p

  a = 4; 
  b = 2;
  c = 0;
  c = c + a > b; printf("a: %d\tb: %d\tc: %d\n",a,b,c);
  c = c + a > b; printf("a: %d\tb: %d\tc: %d\n",a,b,c);
  c +=    a < b; printf("a: %d\tb: %d\tc: %d\n",a,b,c);
  c +=    a > b; printf("a: %d\tb: %d\tc: %d\n",a,b,c);
  c +=    a > b; printf("a: %d\tb: %d\tc: %d\n",a,b,c);

结果是

a: 4    b: 2    c: 1
a: 4    b: 2    c: 1
a: 4    b: 2    c: 1
a: 4    b: 2    c: 2
a: 4    b: 2    c: 3

如果你注意到,前两行是相同的。或者 'c' 在第一个 c = c + a > b 之后没有得到更新; 但是,当我们使用增量赋值时,c 的值会更新 +=

有什么想法吗?

【问题讨论】:

  • 想象会发生什么?一切都与它应该的完全一样。
  • 这属于“丑陋”的代码:'>` 运算符不是算术运算符,因此不应在算术语句或表达式中使用它。这是很久以前布尔类型和运算符不可用(在古代语言中)的一种黑客攻击。

标签: c variable-assignment


【解决方案1】:

&lt; 的优先级低于+

c = c + a &gt; b; 被解释为c = (c + a) &gt; b;

就是这样,不需要有原因,但如果有原因,可能是人们比较算术表达式而不是在算术表达式中使用比较结果。..

【讨论】:

    【解决方案2】:

    在第一行中,c + a &gt; b 为真,它转换为1,因此第一行读取为c = 1;。冲洗并重复。

    【讨论】:

      【解决方案3】:

      编译器将您的代码解释为 c = (c + a) > b,您可能希望它被解释为 c = c + (a > b)。

      【讨论】:

        猜你喜欢
        • 2012-10-09
        • 2012-11-13
        • 2023-03-09
        • 2016-02-20
        • 2019-08-26
        • 2018-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多