C 有人能解析下列表达式的优先级吗?
有人能给我[++b]和+++a[b]的抽象语法树的优先级吗?这样我就可以更好地理解我在计算运算符的顺序时遇到了困难。我得到表达式计算与运算符的计算顺序无关在这种情况下,在数组[expr1]expr1(子脚本表达式)中,expr1中的任何运算符都应该首先求值?我只是说在a[++b]…]中,[]的优先级高于++(前缀),所以我看了表达式a[++b],认为b包含在两个运算符中,其中较高的prec。[]应首先进行评估。 但是有人告诉我哪里错了? **C 有人能解析下列表达式的优先级吗?,c,operator-precedence,C,Operator Precedence,有人能给我[++b]和+++a[b]的抽象语法树的优先级吗?这样我就可以更好地理解我在计算运算符的顺序时遇到了困难。我得到表达式计算与运算符的计算顺序无关在这种情况下,在数组[expr1]expr1(子脚本表达式)中,expr1中的任何运算符都应该首先求值?我只是说在a[++b]…]中,[]的优先级高于++(前缀),所以我看了表达式a[++b],认为b包含在两个运算符中,其中较高的prec。[]应首先进行评估。 但是有人告诉我哪里错了? ** **评估参数列表时,没有序列点。因此,唯一可以保证的
**评估参数列表时,没有序列点。因此,唯一可以保证的是,在调用printf之前的某个时刻,
b
将作为后增量的副作用而递增。这根本不是优先顺序问题
这个答案适用于你的原始代码
printf("%d ",a[b++], ++a[b]);
我看到您现在已经完全改变了。在您的示例中
a[++b]
,b
不是[]
的操作数[]
有两个操作数,一个在[
前面,一个在[
和
之间。首先,请试着理解++
的意思是a=a+1
。现在a++
和+/a
之间的区别(前后):
a++
将在语句完成后执行,即(在next之后;
或行),其中将立即执行++a
现在来谈谈你的观点,a[b++]
++
正在处理数组索引b
,其中a[b]++
正在处理bth值。a[++b]
和++a[b]
正在增加值,然后再进行另一次计算。给我们看一些代码,在C中是[value]用于访问数组位置,a(a[++b])是数组吗?您想说什么?由于[]具有更高的优先级,因此它下面的++b将进行计算,即b=b+1;
@PHIfounder++(前缀)如何在[]之前进行计算因为两个运营商都在b@PHIfounder++b
的计算结果为b+1
。这是表达式的值。它还计划变量b
递增。对b
的赋值将发生在下一个序列点之前的某个点,但赋值时间与[]的优先级无关
或任何其他运算符。在f()[++b]
中,变量b
可以在调用f()
之前或之后递增。这是未指定的。在某些其他情况下,例如(b++)+(-b)
,将赋值组合到b
会使程序的行为未定义。所有这些都与优先级无关。@C标准对这些方面的规定尽可能少,原因有两个:1)标准应该理想地适应各种预先存在的C编译器,以便它们已经成为标准d兼容,2)这为给定的编译器提供了更多的机会为其目标汇编语言生成高效的代码
,当然必须先计算值b+1
,然后才能进行内存访问,但编译器可以选择在调用f()之前还是之后将此新值写回b
,以最有效的为准即使上述情况也不能保证,因为如果标量对象上的副作用相对于同一标量对象上的不同副作用或使用同一标量对象的值进行的值计算不排序,则行为是未定义的。[ISO/IEC 9899]他只调用了一次副作用,并且他使用的是同一个标量对象的值,因此,行为是未定义的。哦,对了,我以为你在谈论增量。是的,我意识到行为在任何时候都是未定义的,即b的值
printf("%d ",a[b++], ++a[b]);