我找到了这段文字(来源: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 递增。
这也是它对--运算符的工作方式。