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

Is this a undefined behaviour or normal output

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

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

o/p

3

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

相同
++(a[1])

但这怎么可能,因为我们有一个预递增运算符,它必须先递增 a,然后才能取消引用。

请指正我的疑惑。我们如何获得 3?

这就是预增量运算符的工作原理。它类似于 ++count。所以这里你在 a[1] 的值(因为 [] 比 ++ 具有更高的优先级)被递增,然后它被打印到控制台上。

行为定义明确。运算符 [] 的优先级高于前缀 ++ 运算符。因此操作数 a 将绑定到 []。它将被解释为

printf("%d", ++(a[1]));

如您所见:http://en.cppreference.com/w/cpp/language/operator_precedence

运算符 [] 的优先级高于 ++

你的括号是对的,你认为应该发生的事情的理由显然是错误的。

如果您是对的,并且前缀递增比索引具有更高的优先级,您将在尝试递增数组时遇到格式不正确的代码的编译器错误。

按原样,绝对不可能出现导致 UB 的排序错误或类似错误。