为什么像 ++(++(*++b)) 这样的东西是非法的?
Why is somthing like ++(++(*++b)) illegal?
#include <stdio.h>
int main()
{
int a[3] = {1, 2, 3};
int *b = a;
int c = ++(++(*++b)); /* error: lvalue required as increment operand */
printf("%d", c);
return 0;
}
但以下是合法的:
int c = *++b+1+1;
为什么会存在这样的差异?
以下int c = *++b+1+1;
是合法的,因为
- 有 3 个运算符,即
*
、++
和 +
并检查 man 1 operator
*
和 ++
具有相同的优先级,因此检查结合性 R-->L
- 所以第一个
*++b
已解决,这是有效的并且它给出了值 2
- 现在看起来像
int c = 2+1+1
这也是有效的 C
语句
和 int c = ++(++(*++b));
是非法的,因为第一个 *++b
被执行,它给出一个值让我们说 2(res)
现在你正在做 ++res
这导致一个整数值 3
直到这没问题,接下来当你做 ++3
这是无效的,因为 ++
适用于变量而不是常量。所以它给出 lvalue 错误。
#include <stdio.h>
int main()
{
int a[3] = {1, 2, 3};
int *b = a;
int c = ++(++(*++b)); /* error: lvalue required as increment operand */
printf("%d", c);
return 0;
}
但以下是合法的:
int c = *++b+1+1;
为什么会存在这样的差异?
以下int c = *++b+1+1;
是合法的,因为
- 有 3 个运算符,即
*
、++
和+
并检查man 1 operator
*
和++
具有相同的优先级,因此检查结合性R-->L
- 所以第一个
*++b
已解决,这是有效的并且它给出了值2
- 现在看起来像
int c = 2+1+1
这也是有效的C
语句
和 int c = ++(++(*++b));
是非法的,因为第一个 *++b
被执行,它给出一个值让我们说 2(res)
现在你正在做 ++res
这导致一个整数值 3
直到这没问题,接下来当你做 ++3
这是无效的,因为 ++
适用于变量而不是常量。所以它给出 lvalue 错误。