在查看c 中的同一语句中的同一变量是否可以有一个增量器和一个减量器
我发现您可以在一个变量上使用多个前缀递增/递减运算符,但只有一个后缀
前任:
++--++foo; // valid
foo++--++; // invalid
--foo++; // invalid
为什么是这样?
在查看c 中的同一语句中的同一变量是否可以有一个增量器和一个减量器
我发现您可以在一个变量上使用多个前缀递增/递减运算符,但只有一个后缀
前任:
++--++foo; // valid
foo++--++; // invalid
--foo++; // invalid
为什么是这样?
这是因为在 C++(但不是 C)中,结果++x
是 lValue,这意味着它是可赋值的,因此是可链接的。
但是,结果x++
不是 lValue,而是 prValue,这意味着它不能被分配,因此不能被链接。
在 C++ 语言中,前缀递增/递减运算符返回左值,而后缀运算符返回右值。同时,所有修改运算符都需要左值参数。这意味着前缀递增/递减的结果可以传递给任何其他需要左值参数的附加运算符(包括额外的递增/递减)。
出于同样的原因,在 C++ 中,您可以编写这样的代码
int i = 0;
int *p = &++i;
这将增加i
并p
指向i
. 一元&
需要左值操作数,这就是为什么它将使用前缀的结果++
(但不适用于后缀之一)。
应用于同一对象的具有多个内置前缀递增/递减的表达式会产生未定义的行为,但它们仍然是格式良好的(即“可编译”)。
像这样的表达式++foo--
是无效的,因为在 C++ 中,后缀运算符的优先级高于前缀运算符。大括号可以改变这一点。例如,(++foo)--
是一个格式良好的表达式,尽管它再次导致未定义的行为。