【问题标题】:Understanding the increment operator in C了解 C 中的增量运算符
【发布时间】:2013-10-09 14:36:53
【问题描述】:

为什么下面的 C 语言是非法的?

y = (w + x)++;

根据我的书,这是非法的,但我不明白为什么。

【问题讨论】:

    标签: c syntax lvalue


    【解决方案1】:

    i++ 中,i 已更改。执行后,i 的值是其先前值的一加。但是,您不能在 w+x 中存储值,因此您不能执行以下任何操作,所有这些(如果它们有效)都会或多或少产生相同的效果:

    w+x = w+x+1;
    w+x += 1;
    (w+x)++;
    

    可以放置在赋值左侧的东西通常称为lvaluel 代表left)。简而言之,++ 只能应用于左值,而w+x 不是左值。您可以在此问题及其答案中阅读有关左值(和其他类型的值)的更多信息:

    【讨论】:

    • 有道理!谢谢!
    【解决方案2】:

    根据 Dennis M. Ritchie 的书:"The C Programming Language"

    2.8 递增和递减运算符

    (第 44 页)

    递增和递减运算符只能应用于变量; (i + j)++ 这样的表达式是非法的。操作数必须是算术或指针类型的modifiable lvalue

    因为一个表达式

    i++;
    

    相当于:

    i = i + 1;
    

    这样的表达式:

    (i + j)++;
    

    类似于:

    (i + j) =  (i + j) + 1;  // meaning less
    

    这看起来意义不大,我们不能修改表达式。

    相关: 在 gcc 4.4.5 中可能想知道的一个有趣的错误是表达式 j = ++(i | i); 编译时会产生左值错误。阅读:j = ++(i | i); and j = ++(i & i); should an error: lvalue?

    从 (1) Expression must be a modifiable lvalue error 和 (2) msdn 文档中了解可修改的左值:Lvalues and Rvalues

    【讨论】:

    • 引用来源很好(这很好),但我希望这本书没有说“变量”,因为左值比变量多。例如,您可以使用a[i]++ 和 (*p)++。但是,说“我们不能修改表达式的 [值]”是不对的,因为变量也是表达式,其他左值也是。
    • @JoshuaTaylor 很好的例子谢谢!
    • @JoshuaTaylor 注意但++(*p)++ 这是左值错误:) 而++*p++ 不是
    • 当然,但这是一个优先问题。 ++*p++ 在做什么到底是什么?增加了什么?什么指针被尊重?之后增加了什么?我不确定没有测试,但我希望它编译后,它正在执行 (p = p+1),然后执行 ++(*p)
    • @JoshuaTaylor ++*p++ 等价于++*p; p++; 第一个由p 寻址的值递增,然后p 本身递增以指向下一个位置。注意++*p++的括号版本是:++(*(p++));
    【解决方案3】:

    y = x++ 返回变量x 的增量值。

    y = (x + z)++ 失败,因为(x + z) 不是变量。

    【讨论】:

      【解决方案4】:

      这是非法的,因为(w+x) 不是合法的左侧值。

      左侧值是可以分配给(即变量)的值。

      【讨论】:

      【解决方案5】:

      后增量需要l-valuew+x 不需要。

      【讨论】:

      【解决方案6】:

      这是非法的,因为(x+y) 不是变量。

      考虑

      a++a = a + 1

      (x+y)++是什么? (x+y) = (x+y) + 1?

      【讨论】:

        【解决方案7】:

        后递增和递减需要l-value(比如左侧的变量)。 w+x 不是变量。递增w+x 就像递增3 + 4,这是非法的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-07-06
          • 2011-02-16
          • 1970-01-01
          • 1970-01-01
          • 2012-10-17
          • 2016-03-29
          • 2013-10-08
          • 1970-01-01
          相关资源
          最近更新 更多