【问题标题】:++i operator difference in C# and C++C# 和 C++ 中的 ++i 运算符区别
【发布时间】:2012-03-19 23:45:30
【问题描述】:

我有以下用 C++ 和 C# 编写的代码

 int i=0;
 ++i = 11;

这个C#编译器带来错误后

The left-hand side of an assignment must be a variable, property or indexer

但 C++ 编译器生成此代码时没有错误,我得到了 11 的值 i 的结果。造成这种差异的原因是什么?

【问题讨论】:

  • 题外话:为什么要递增,然后直接设置为11?增量没有意义。
  • 这段代码有什么用?
  • someArray[++i] = 11 会更有意义。
  • 这对我来说很有趣。 @mesiesta 正确解释了为什么会这样。

标签: c# c++ int increment language-specifications


【解决方案1】:

C# 和 C++ 是两种完全不同的语言和概念。他们只共享这个名字,因为他们的语法是基于 C 的。所以实际上“为什么这适用于 C# 而不是 C++”作为一个问题是没有意义的。这就像说为什么一张桌子在英语中称为“table”,但在西班牙语中称为“mesa”。因为决定是这样的。

C# 根本不允许这样的语法。

在 C++ 中,您可以:首先计算 ++i,生成 i = 1,然后将 11 分配给 i,生成 i = 11

【讨论】:

  • 这有点苛刻。问题对于C 语言来说很常见,许多在C++ 中工作的东西在C# 中也工作!这是一个完全有效的问题 IMO,特别是因为在 C++ 中,有问题的代码代表了一个没有逻辑意义的语句。
  • 苛刻?为什么苛刻?我只是说 C# 和 C++ 除了基于 C 之外没有任何共同点。这个问题对 C 来说并不常见,因为他不是在问 C,而且在 C 中这句话完美地工作,而在 C# 中却没有,这只是演示了 C# 与 C 无关,除了名称和语法(顺便说一句,它被许多语言如 Perl、Java 等复制)。
  • C# 和 C++ 有相似之处...没有什么不同,例如 Java 和 Haskell。所以对我来说,这是一个有效的问题,我知道这很有趣。
  • 它们与 Java 和 Haskell 不同,但我不会说明所有不同之处和极少数相似之处。知道这确实很有趣,但我个人不会那样提出问题。
【解决方案2】:

请注意,++i = 11 在 C++03 中调用 undefined,因为您要修改 i 两次,而没有中间的序列点。但是,它在 C++11 中定义良好:首先是自增,然后是赋值。

【讨论】:

    【解决方案3】:

    语义非常不同。在 c++ 中,语义是将值 11 分配给由 i 标识的存储位置。在 C# 中,语义等同于以下语句的语义

    1=11
    

    这等于尝试将值 11 分配给 C# 编译器不允许的值 1。 (Fortran 编译器实际上确实允许这样做并且会创建地狱般的调试场景)

    【讨论】:

      【解决方案4】:

      不同之处在于,前置自增运算符在 C++ 中是 左值,而在 C# 中不是。
      在 C++ 中,++i 返回对递增变量的引用。在 C# 中,++i 返回变量 i 的递增值。
      所以在这种情况下,++i 在 C++ 中是 lvalue 而在 C# 中是 rvalue

      来自关于前缀递增运算符的 C++ 规范

      操作数的类型应为算术类型或指向 完全定义的对象类型。该值是新的值 操作数;它是一个左值

      P.S.后缀自增运算符 i++ 在 C# 和 C++ 中都不是左值,所以这行代码在两种语言中都会带来错误。

       int i=0;
       i++ = 11;
      

      【讨论】:

        猜你喜欢
        • 2014-10-28
        • 1970-01-01
        • 2011-06-10
        • 2013-06-05
        • 2013-06-14
        • 1970-01-01
        • 2019-07-21
        • 2010-11-08
        相关资源
        最近更新 更多