int val = 5;
printf("%d",++val++); //gives compilation error : '++' needs l-value
int *p = &val;
printf("%d",++*p++); //no error
有人可以解释这两起案件吗?感谢。
答案 0 :(得分:27)
++val++
与++(val++)
相同。由于val++
的结果不是左值,这是非法的。正如Stephen Canon指出的那样,如果val++
的结果是左值,++(val++)
将是未定义的行为,因为++
之间没有序列点。
++*p++
与++(*(p++))
相同。由于*(p++)
的结果是左值,这是合法的。
答案 1 :(得分:4)
表达式++val++
与(++val)++
(或者++(val++)
相同,无论如何它都不是很相关)。 ++
运算符的结果不是变量,而是值,并且您不能将运算符应用于值。
表达式++*p++
与++(*(p++))
相同。 p++
的结果是值,但*(p++)
的结果是一个内存位置,可以应用++
运算符。
答案 2 :(得分:1)
另请注意,您正在通过
更改指针的地址int k = ++*p++;
答案 3 :(得分:0)
int j = ++val++; //gives compilation error
那是因为你无法预先增加rvalue
。 ++val++
被解释为++(val++)
,因为后增量运算符的优先级高于预增量运算符。 val++
返回rvalue
,预增量运算符要求其操作数为lvalue
。 :)
int k = ++*p++; //no error
++*p++
被解释为++(*(p++))
,这完全有效。