如何用优先表证明C后缀增量运算符?
我正在使用C运算符优先级表来更好地理解C的运算符优先级。我在理解以下代码的结果时遇到问题:如何用优先表证明C后缀增量运算符?,c,increment,operator-precedence,postfix-operator,C,Increment,Operator Precedence,Postfix Operator,我正在使用C运算符优先级表来更好地理解C的运算符优先级。我在理解以下代码的结果时遇到问题: int a, b; a = 1; b = a++; // does not seem to follow C operator precedence 使用C运算符的优先级表,我无法解释为什么使用后缀++运算符时,首先计算赋值,然后计算增量 后缀增量运算符(++)在C中具有最高的优先级,赋值运算符(=)具有最低的优先级。因此,在上面的代码中,首先必须执行后缀++,然后执行赋值=。因此,变量a和b都应该
int a, b;
a = 1;
b = a++; // does not seem to follow C operator precedence
使用C运算符的优先级表,我无法解释为什么使用后缀++
运算符时,首先计算赋值,然后计算增量
后缀增量运算符(++
)在C中具有最高的优先级,赋值运算符(=
)具有最低的优先级。因此,在上面的代码中,首先必须执行后缀++
,然后执行赋值=
。因此,变量a
和b
都应该等于2,但它们不是
为什么C运算符优先级似乎不适用于此代码
后缀的最高优先级何时不显示?这与优先级无关。这是后缀
++
操作符如何工作的问题
后缀++
运算符的计算结果为其操作数的当前值,并具有递增操作数的副作用。相反,前缀++
运算符的计算结果是其操作数的递增值
int a, b;
a = 1;
b = a++; // b is 1, a is 2
b = ++a; // b is 3, a is 3
后缀++
运算符的这种行为记录在第6.5.2.4p2节:
后缀的结果
++
运算符是操作数的值。作为副作用,操作数对象的值会增加(即值1)
添加了相应类型的。)请参阅的讨论
加法运算符和复合赋值,了解
约束、类型和转换以及
指针上的操作。结果的数值计算
在更新存储的
操作数的值。关于
不确定顺序的函数调用,后缀的操作
++
是一个单独的评估。后缀
原子类型对象上的++
是具有内存顺序\u seq\u cst内存顺序语义的读-修改-写操作
前缀++
运算符见第6.5.3.1p2节:
前缀的操作数的值
++
运算符递增结果是递增后操作数的新值。表达式
++E
相当于(E+=1)
。有关附加运算符和复合赋值的信息,请参见附加运算符和复合赋值的讨论
约束、类型、副作用和转换以及
指针上的操作
优先顺序发生在解析过程中。这意味着
++
适用于a
,而不是b=a
但是++
表示后增量,因此在a
评估为分配给b
后执行
如果希望两者都取值2
,则执行预增量:
b = ++a;
优先级仅决定在解析期间哪些运算符与哪些操作数分组。它不控制评估的顺序<代码>++的优先级高于=
只意味着b=a++
被解析为b=(a++)
,而不是(b=a)+
++
运算符(一元和后缀形式)有结果和副作用。在表达式b=a++
中,a++
的结果是a
的当前值-这就是分配给b
的值。a++
的副作用是将1添加到a
未指定分配到b
和更新到a
的顺序。最直接的是
b <- a
a <- a + 1
实际的计算顺序取决于编译器、优化设置,甚至是周围的代码
强制表达式从左向右求值的唯一运算符是
&&
、|
、?:
和逗号运算符 如果不清楚,则优先级和关联性与求值顺序无关。但是,这些术语的混淆是可以理解的。a
被检索用于赋值,然后a
的内存位置被递增(而不是被检索的值)。我认为“postfix”中的“post”表示增量发生在对所有其他内容进行计算之后。i、 echar*str=“FreeBSD”;char increment(){((*str++)++1)}
,指针被取消引用,算术被应用,返回的值(在本例中为“G”)才被应用增量。当我开始处理像达夫的设备这样的事情时,这很有帮助。
tmp <- a
a <- a + 1
b <- tmp
b <- a + 1
a <- a + 1