6

在查看c 中的同一语句中的同一变量是否可以有一个增量器和一个减量器

我发现您可以在一个变量上使用多个前缀递增/递减运算符,但只有一个后缀

前任:

++--++foo; // valid
foo++--++; // invalid
--foo++;   // invalid

为什么是这样?

4

2 回答 2

9

这是因为在 C++(但不是 C)中,结果++x是 lValue,这意味着它是可赋值的,因此是可链接的。

但是,结果x++不是 lValue,而是 prValue,这意味着它不能被分配,因此不能被链接。

于 2012-07-26T23:32:16.400 回答
6

在 C++ 语言中,前缀递增/递减运算符返回值,而后缀运算符返回右值。同时,所有修改运算符都需要左值参数。这意味着前缀递增/递减的结果可以传递给任何其他需要左值参数的附加运算符(包括额外的递增/递减)。

出于同样的原因,在 C++ 中,您可以编写这样的代码

int i = 0;
int *p = &++i;

这将增加ip指向i. 一元&需要左值操作数,这就是为什么它将使用前缀的结果++(但不适用于后缀之一)。

应用于同一对象的具有多个内置前缀递增/递减的表达式会产生未定义的行为,但它们仍然是格式良好的(即“可编译”)。

像这样的表达式++foo--是无效的,因为在 C++ 中,后缀运算符的优先级高于前缀运算符。大括号可以改变这一点。例如,(++foo)--是一个格式良好的表达式,尽管它再次导致未定义的行为。

于 2012-07-26T23:32:04.657 回答