【问题标题】:What does the ++ (or --) operator return? [duplicate]++(或--)运算符返回什么? [复制]
【发布时间】:2023-03-03 04:44:02
【问题描述】:

在使用++ 运算符时,我尝试编写以下内容:

++i++;

一开始我希望它可以编译,但我得到了一个编译器错误:

递增或递减运算符的操作数必须是变量, 属性或索引器。

然后我尝试写 ++(i++) 来帮助编译器理解我的意思,但它也(不出所料)不起作用。

所以我想知道++ 运算符返回什么?由于编译器错误,我期望++i 不会返回代表i 值递增的int,但事实并非如此,因为我可以成功地执行i = (++i) + 1...

有人知道为什么++ 运算符不能被链接吗?

另外,(++i).GetType() 确实返回 System.Int32

【问题讨论】:

标签: c# operators


【解决方案1】:

在 C# 中,++ operator 在递增之前(对于 i++)或之后(对于 ++i)返回

您看到的错误是因为该运算符只能用于变量、属性或索引器原因是因为操作符的意图是增加被引用的变量。您不能在表达式或其他类型上使用它。 (9++) 会做什么?

您希望(i++)++ 等同于i++; i++。但是i++ 返回一个 并在内部递增i。由于您不能将 ++ 运算符应用于 value,因此无法进行链接。

与C++不同的是,++前缀操作符将reference作为输入,返回一个reference到原来的值,因此您可以链接运算符,因为它只是使用指针而不是值。 postfix 操作符返回一个值,因此不能被链接。

【讨论】:

【解决方案2】:

++-- 运算符的结果是变量、属性或索引器的,而不是变量、属性或索引器本身。

您不能对像 (i++)++ 这样的变量进行双倍递增,原因与您不能像 100++ 这样的自身递增值的原因相同。

【讨论】:

  • 哇,我不敢相信我没有想到这一点。非常感谢您的清晰解释。
【解决方案3】:

如果我可以借用 C 或 C++ 的术语,这里的 ++ 运算符会返回一个“r 值”。 r 值不映射到语言类型,它是一种语法技巧来区分什么是可分配(可修改)和什么不是。

在赋值操作的左侧可以找到的东西称为左值(左值),而在赋值操作的右侧可以找到的东西称为“r-values”(右值) . ++ 运算符必须对左值进行操作,因为它需要分配给它。但是,返回的表达式必须是 r 值,因为在 C# 中执行 i++ = 4 没有意义,就像执行 foo.Bar() = 41 = 5 没有意义一样。

C# 本身没有左值或右值,但它将赋值左侧的内容限制为变量、属性和索引器操作。这并非巧合,您也可以使用 ++ 运算符。

【讨论】:

  • 好答案。我注意到您说 C# 不使用有些令人困惑的“右值”/“左值”术语是正确的。相反,C# 将所有表达式分类为以下之一:值、变量、命名空间、类型、方法组、空字面量、匿名函数、属性、索引器、事件和返回 void 的方法调用。 (数组初始值设定项虽然看起来像表达式,但在技术上不是表达式。)
【解决方案4】:

我意识到你不能在表达式之前或之后使用++

使用时:

++(i++);

你正在做类似的事情:

++(<expression>)

编译器首先解析表达式,然后它会增加表达式的结果,这听起来很疯狂。操作数++ 通过增加一个立即变量而不是表达式的结果来工作。

如何评估编程表达式?语言语法(BNF)http://people.cis.ksu.edu/~schmidt/301s11/Lectures/bnfT.html

这里是另一个正确使用这个操作数++的例子

int i = 0, j = 0;
int sum = i++ + j++;
//result sum = 0, i = 1, j = 1

这个操作数 ++ 很乱,因为一次做 3 件事(读取、递增、赋值)。我个人不会在大型表达式中使用,比如上面的例子:i++ + j++。但我仍然在 for 循环或 while 循环中单独使用它。

即使是像i = j++; 这样的简短表达式也是一团糟。 让您的代码简单易懂。同样的表达式可以写成:

i = j;
j++; //or j+=1;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    • 2011-05-27
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多