Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何用优先表证明C后缀增量运算符?_C_Increment_Operator Precedence_Postfix Operator - Fatal编程技术网

如何用优先表证明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都应该

我正在使用C运算符优先级表来更好地理解C的运算符优先级。我在理解以下代码的结果时遇到问题:

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、 e
char*str=“FreeBSD”;char increment(){((*str++)++1)}
,指针被取消引用,算术被应用,返回的值(在本例中为“G”)才被应用增量。当我开始处理像达夫的设备这样的事情时,这很有帮助。
tmp <- a
a <- a + 1
b <- tmp
b <- a + 1
a <- a + 1