这是一个非常简单的问题,但在序列点上甚至有一些疑问。
int a[3] = {1,2,4};
printf("%d",++a[1]);
3
这是一个有效的c语句,我得到输出3
,这意味着它与
++(a[1])
但这怎么可能,因为我们有一个预增量运算符,必须首先增加a
,然后必须发生解除引用。
请纠正我的疑问。我们如何获得3
?
答案 0 :(得分:7)
行为定义明确。运算符[]
的优先级高于前缀++
运算符。因此,操作数a
将绑定到[]
。它将被解释为
printf("%d", ++(a[1]));
答案 1 :(得分:4)
你的括号是正确的,你认为应该发生的理由显然是错误的。
如果你是对的,并且前缀增量的优先级高于索引,那么对于格式错误的代码,你会遇到编译器错误,试图增加数组。
按原样,绝对没有机会导致UB的测序错误等。
答案 2 :(得分:1)
预增量运算符的工作原理。它类似于++count
。所以这里你的值[1](因为[]具有比++更高的优先级)得到递增,然后打印到控制台上。
答案 3 :(得分:1)
正如您在此处所见:http://en.cppreference.com/w/cpp/language/operator_precedence
运营商[]
的优先级高于++