鱼C论坛

 找回密码
 立即注册
查看: 410|回复: 7

[已解决]C语言操作符优先级疑问

[复制链接]
发表于 2024-2-23 18:46:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我的测试代码如下所示:

  1. void main()
  2. {

  3.         uint8 u8a;
  4.         uint8 u8b = 3;
  5.         uint8 u8c = 10;

  6.         u8a = ++u8b + u8c--;

  7.         printf("u8a = %u, u8b = %u, u8c = %u\n", u8a, u8b, u8c);

  8.         system("pause");
  9. }
复制代码


我理解C语言操作符优先级应该为后自增/减 > 前自增减 > 加减法,理论上应该输出13,4,9。

但是使用VS2012执行以下代码输出值为14, 4 ,9。

请问是编译器的原因,或者存在什么问题吗?
最佳答案
2024-2-23 20:16:53
本帖最后由 陈尚涵 于 2024-2-23 20:21 编辑

经典的新人问题
位置问题,自增和自减在变量的前与后是不同的,如果在前面,则这个表达式采用操作后的结果,否则使用操作前的
举个例子,a=3,那么++a=4,而a++=3
就是i++和++i的区别啦
求个最佳
Snipaste_2024-02-23_18-45-03.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-2-23 18:47:10 | 显示全部楼层
你的理解基本正确,C语言操作符的优先级是后自增/减 > 前自增/减 > 加减法。根据这个规则,代码中的`++u8b`会先执行,将`u8b`的值增加到4。然后,等号右边的表达式中,`u8b`的值已经是4了,`u8c--`的操作并没有影响到它。所以,`u8a`的值等于4 + 10 = 14,`u8b`的值自增为4,`u8c`的值自减为9。

那么为什么你的输出结果不是理论上的13,4,9呢?可能是因为你对后缀自增和后缀自减操作符的使用有些混淆。在C语言中,后缀自增/减操作符的优先级比前缀自增/减低。也就是说,在一个表达式中,后缀自增/减操作符会比其他运算符先执行。但是,后缀自增/减操作符会使得变量的值在整行表达式结束后才发生变化。所以,在你的代码中,`u8c--`会在整个表达式计算完之后才生效。

如果你想要输出13,4,9,可以修改代码如下:

  1. void main()
  2. {

  3.         uint8 u8a;
  4.         uint8 u8b = 3;
  5.         uint8 u8c = 10;

  6.         u8a = (++u8b) + (u8c--);

  7.         printf("u8a = %u, u8b = %u, u8c = %u\n", u8a, u8b, u8c);

  8.         system("pause");
  9. }
复制代码


这样,先使用括号将后缀自增/减操作符括起来,确保它们的优先级高于加法运算符,再进行加法运算,就可以得到你期望的结果了。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-23 19:52:11 | 显示全部楼层
本帖最后由 tommyyu 于 2024-2-23 20:06 编辑

/*回答出了点问题*/
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-23 20:03:57 | 显示全部楼层
tommyyu 发表于 2024-2-23 19:52
是未定义行为,每个编译器的运行顺序不一样。尽量避免这样的代码。
  1. 真的吗?
  2. 那你找一个输出不是 14,4,9 的编译器看看
  3. 不要看见 ++,-- 运算符就说未定义行为
  4. 请先去弄清楚什么是未定义行为

  5. sh-5.2$ cat main.c
  6. #include <stdio.h>
  7. #include <stdint.h>

  8. int main(void) {
  9.     uint8_t u8a;
  10.     uint8_t u8b = 3;
  11.     uint8_t u8c = 10;
  12.     u8a = ++u8b + u8c--;
  13.     printf("u8a = %hhu, u8b = %hhu, u8c = %hhu\n", u8a, u8b, u8c);
  14.     return 0;
  15. }
  16. sh-5.2$ ./main
  17. u8a = 14, u8b = 4, u8c = 9
  18. sh-5.2$
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-23 20:05:16 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-23 20:16:53 | 显示全部楼层    本楼为最佳答案   
本帖最后由 陈尚涵 于 2024-2-23 20:21 编辑

经典的新人问题
位置问题,自增和自减在变量的前与后是不同的,如果在前面,则这个表达式采用操作后的结果,否则使用操作前的
举个例子,a=3,那么++a=4,而a++=3
就是i++和++i的区别啦
求个最佳
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-23 20:17:34 | 显示全部楼层


大概整明白了,我刚刚好像看成一个变量在自增自减了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-23 20:17:43 | 显示全部楼层

顺序的问题啦
和i++与++i的区别是一样的道理
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-13 21:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表