这是未定义的行为还是正常输出

时间:2015-01-24 14:00:26

标签: c gcc sequence-points

这是一个非常简单的问题,但在序列点上甚至有一些疑问。

int a[3] = {1,2,4};
printf("%d",++a[1]);

O / P

3

这是一个有效的c语句,我得到输出3,这意味着它与

相同
++(a[1])

但这怎么可能,因为我们有一个预增量运算符,必​​须首先增加a,然后必须发生解除引用。

请纠正我的疑问。我们如何获得3

4 个答案:

答案 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

运营商[]的优先级高于++