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]));