关于++运算符

#include

int p = 1;

int foo(){

    printf("p=%d/n", p);

    return 0;

}

 

int main() {

   int x = foo() + (p++) + foo() + (p++) + foo();

   printf("x=%d/n", x);

   return 0;

}

 

这段程序的输出会是什么呢?

对于x=(p++) + (p++)这个表达式计算结果,x的值到底是等于2p+1还是2p+2 有人可能觉得x=3(2p+1),应该不太会有人认为是4(2p+2),但是在Linux平台上测试结果却是2(2p)。我们将对foo的调用插入到表达式中,这样程序计算表达式时在两次使用(evaluate)p的前后都会将p的值打印出来,结果是三次调用foo的输出都是p=1。这样,我们可以简单地归结为:编译器在生成代码是,将对p的增1(increment)操作放到了表达式的最后,所以在计算x的值是其实我们始终使用的是经表达式前一行作用后p的值。 事实上,我们在C语言标准中找到一个这样的例子: sum = (((sum * 10) - '0') + ((*(p++)) = (getchar()))); 文档中有这样的说明: “the actual increment of p can occur at anytime between the previous sequence point and the next sequence point (the ;)”。可见,p++语句所要表达的对p增1的行为究竟发生在哪一点事实上是不确定的,或者说,是取决于编译器的实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值