C语言关于自增运算符优先级以及printf函数的运算方向分析

C语言关于自增运算符优先级以及printf函数的运算方向分析
1、示例代码
int *p;
int a[5]={4,3,6,5,1};
p = a;
printf("%d %d",*p++,(*p)++);

//输出结果一般为5 4 ,此结果的输出是因为printf函数的执行顺序是自右向左。
/*但在不同的编译器中,printf函数的执行顺序是不确定的,一般是自右向左运算,但也有些编译器会自左向右进行运算
当输出结果为4 3 时,即说明编译器中的printf函数是自左向右执行的。*/
2、代码执行过程
2.1 自右向左执行时

当编译器中的printf函数是自右向左开始执行时,具体运行步骤如下:

  1. 因为是自右向左开始执行,所以会先对(*p)++进行运算,先执行小括号中的取值运算,将数组中的首元素值取出,又因为自增运算符++放在后面,所以是先赋值后自增,这时在第二个位置就输出了数组的首元素的值,也就是4;
  2. 进行完上步运算后,数组内的首元素的值已经被自增运算符改变了,此时的a[0]=5;
  3. 之后开始进行*p++的运算,因为++的运算符和取值运算符的优先级相同,则需要按结合方式自右向左执行,即相当于 *(p++) 所以先对地址p进行操作,但因为自增运算符在后面所以依旧是先赋值后运算,输出数组中的首元素地址,再经过取值符号后输出首元素的值,因值在第一步中已经被改变,故结果输出5.
  4. 最终结果便是:5 4 ,p最后指向数组a[1]的地址,最后数组内容为5 3 6 5 1
2.2 自左向右执行时

在有些编译器中printf函数是自左向右执行的,这时候对于这段代码会产生不一样的结果,过程如下:

  1. 因为是自左向右执行,先对*p++进行运算,由上可得此步骤会得到输出当前指针指向的值,之后指针向后位移一位。当前指针指向首元素地址,故输出为4;

  2. 之后开始对(*p)++进行运算,此时p指向a[1],也可同上理解,先进行赋值再进行自增运算,故输出的是a[1]还未自增的值,即为3,之后a[1]的值再自增1;

  3. 故最终结果为:4 3,p最后也指向数组a[1],最后数组内容为 4 4 6 5 1

3、总结

在C语言的代码编写中,应该避免出现上述情况,在书写表达式的时候应注意其含义不应出现有歧义的情况,而像++、–这类自增自减运算符,固然可以让代码变得简洁美观,但很不利于人去理解代码的含义以及对后续代码的维护都会产生额外的负担,代码应以简单明了为主。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值