C 中的优先级运算符



我找到了这段文字(来源:https://education.cppinstitute.org/),我正在尝试理解第二条指令。

您能回答这两个指令的区别吗?

c = *p++;

c = (*p)++;

我们可以解释:第一个赋值好像执行了以下两个不相交的指令;

c = *p;
p++;

换句话说,p指向的字符被复制到c变量中;然后,p被增加并指向数组的下一个元素

第二个分配按如下方式执行:

c = *p;
string[1]++;

p指针没有更改,仍然指向数组的第二个元素,并且只有此元素增加 1。

我不明白的是,为什么当=运算符的优先级低于++运算符时,它不会递增。

关于此语句表达式

c = (*p)++;

,你说

我不明白的是为什么 [p] 在 = 时不递增 运算符的优先级低于 ++ 运算符。

有一个非常简单的解释:p不会因为计算该表达式而递增,因为它不是++运算符的操作数。

这部分正是因为=运算符的优先级较低:因为=的优先级非常低,++的操作数是表达式(*p)而不是表达式c = (*p)。 特别要注意的是,在这种情况下,p本身甚至不合理地成为操作数,这与没有括号的变体不同。

继续前进,表达式(*p)指定p指向的事物,就像*p单独做的那样。 上下文表明,在那个时候,这与string[1]指定的相同。正如文本所说,这就是递增的内容,它在递增之前的值是后缀++操作的结果。

我不明白的是,当=运算符的优先级低于++运算符时,为什么它不递增。

表达式示例的值

x++

是递增前 x 的值。

所以如果你会写

y = x++;

然后,变量y在递增之前获取x的值。

来自 C 标准(6.5.2.4 后缀递增和递减运算符)

2后缀 ++ 运算符的结果是操作数的值。 作为副作用,操作数对象的值递增(即 是,将适当类型的值 1 添加到其中)。...这 结果的值计算在副作用之前排序 更新操作数的存储值。...

如果而不是表达式

c = (*p)++;

你会写

c = ++(*p);

然后你得到你的结果。这演示了后缀增量运算符 ++ 和前缀(一元)增量运算符 ++ 之间的区别。

++跟在变量后面时,变量在使用后会递增。

所以当你有

y = x++;

在 y 获取 x 的值后,x 递增。

这也是它对--运算符的工作方式。

最新更新