为什么++ i ++在C中给出"L值必需错误"?

vin*_*mar 0 c

在下面的代码中:

main()
{
  int i = 5;
  printf("%d", ++i++);
}
Run Code Online (Sandbox Code Playgroud)

本程序给出错误"L-Value required".

有人可以告诉我:为什么编译错误?

Gri*_*han 7

因为后缀运算符的优先级高于前缀运算符,所以表达式++i++等价于 ++(i++),相当于 ++( i + 1).编译器给左值错误,因为你申请++一个表达式(i++)不是修改的左值,所以不能有效的表达根据增加的操作符定义.

根据Dennis M. Ritchie的书:"C编程语言":

2.8增量和减量运算符

(第44页)

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

相关:在gcc 4.4.5中可能想知道的一个有趣的错误是表达式j = ++(i | i);编译应该产生l值错误.阅读:j = ++(i | i);并且j = ++(i & i);应该出错:左值?

此外,没有中间修改相同的变量更多然后在表达一旦序列点的原因是不确定的行为.理解阅读解释这些未定义的行为i = i++ + ++i;.

  • 实际上,后缀运算符的优先级高于前缀运算符,因此`i +++`将首先完成,但由于`i ++`的结果是r值而不是l值而前缀`++`只能应用到l值,给出错误消息.在达到在表达式中多次修改单个变量的未定义行为之前,这是一个问题. (4认同)
  • 我不知道你怎么能声称"未定义的行为,因为`i`在没有序列点的情况下被修改两次"并且在同一口气中解释了`i`被修改一次. (2认同)
  • 去看看标准.运算符按优先顺序(从高到低)和§6.5.2**后缀运算符**出现在§6.5.3**一元运算符**之前.(而且我看到我发明了一个新的运算符`i +++`;我的意思是`我++'!) (2认同)