C中的优先运营商

时间:2017-09-04 22:08:48

标签: c operators post-increment pre-increment

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

你能回答这两条指令的区别问题吗?

 c = *p++;

 c = (*p)++;

我们可以解释:第一个作业就好像已经执行了以下两个不相交的指示;

 c = *p;
 p++;

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

第二项任务执行如下:

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

p指针未更改,仍指向数组的第二个元素,只有此元素增加1.

我不明白当=运算符的优先级低于++运算符时,它不会增加的原因。

3 个答案:

答案 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递增。

这也适用于 - 运算符。