我找到了这个文字(来源:https://education.cppinstitute.org/),我试图理解第二条指令。
你能回答这两条指令的区别问题吗?
c = *p++;
和
c = (*p)++;
我们可以解释:第一个作业就好像已经执行了以下两个不相交的指示;
c = *p;
p++;
换句话说,p
指向的字符被复制到c
变量;然后,p
增加并指向数组的下一个元素。
第二项任务执行如下:
c = *p;
string[1]++;
p
指针未更改,仍指向数组的第二个元素,只有此元素增加1.
我不明白当=
运算符的优先级低于++
运算符时,它不会增加的原因。
答案 0 :(得分:2)
我不明白为什么它在=时不会增加 运算符的优先级低于++运算符。
表达式
的值x++
是递增前的x值。
所以,如果你要写
y = x++;
然后变量y
在递增之前获得x
的值。
来自C标准(6.5.2.4 Postfix递增和递减运算符)
2 后缀++运算符的结果是操作数的值。 作为副作用,操作数对象的值递增(即 是,相应类型的值1被添加到它)。 ...... 结果的值计算按排序之前的副作用 更新操作数的存储值。 ...
如果不是表达式
c = (*p)++;
你要写
c = ++(*p);
然后你得到你期望的结果。这演示了后缀增量运算符++和前缀(一元)增量运算符++。
之间的区别答案 1 :(得分:2)
关于这个陈述表达式
c = (*p)++;
,你说
我不明白为什么[
p
]在=时不会递增 运算符的优先级低于++运算符。
有一个非常简单的解释: p
不会因为评估该表达式而递增,因为它不是++
运算符的操作数。
这部分完全是因为=
运算符的优先级较低:因为=
的优先级太低,++
的操作数是表达式(*p)
而是而不是表达式c = (*p)
。特别要注意的是p
本身在这种情况下甚至不可能成为操作数,与没有括号的变体不同。
接下来,表达式(*p)
指定p
指向的内容,就像单独*p
一样。上下文表明,在那个时候,string[1]
指定了相同的内容。 那是递增的,就像文本所说的那样,并且它在增量之前的值是后缀++
操作的结果。
答案 2 :(得分:-1)
当 ++ 跟随变量时,变量在使用后会递增。
所以当你有
时y = x++;
在y得到x的值之后,x递增。
这也适用于 - 运算符。