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

C 这是未定义的行为还是正常输出,c,gcc,sequence-points,C,Gcc,Sequence Points,这是一个非常简单的问题,但在顺序点上甚至有一些疑问 int a[3] = {1,2,4}; printf("%d",++a[1]); o/p 如果这是一个有效的c语句,我将得到输出3,这意味着它与 ++(a[1]) 但是这怎么可能呢,因为我们有一个预增量操作符,它必须先增加a,然后才能进行解引用 请纠正我的疑问。我们如何得到3?这就是预增量运算符的工作方式。它类似于++count。因此,在这里,您在[1]处的值(因为[]的进阶比++高)将递增,然后将其打印到控制台上。行为定义良好。运算符[]

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

int a[3] = {1,2,4};
printf("%d",++a[1]);
o/p 如果这是一个有效的c语句,我将得到输出
3
,这意味着它与

++(a[1])
但是这怎么可能呢,因为我们有一个预增量操作符,它必须先增加
a
,然后才能进行解引用


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

这就是预增量运算符的工作方式。它类似于
++count
。因此,在这里,您在[1]处的值(因为[]的进阶比++高)将递增,然后将其打印到控制台上。

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

printf("%d", ++(a[1]));
正如你在这里看到的:


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

您的括号是对的,您认为应该发生的事情的基本原理显然是错误的

如果您是对的,并且前缀increment的优先级高于索引,那么对于格式错误的代码,您将得到一个编译器错误,试图递增数组


照目前的情况,绝对不可能出现导致UB的排序错误或类似错误。

谢谢你的回答。谢谢你的回答。
a
甚至不是一个可赋值的左值,所以即使优先法则不同,你也不能得到4。(你不能增加数组)(你也不能增加数值文本
1
)@wildplasserr:Ya明白了。。
printf("%d", ++(a[1]));