C语言操作符优先级疑问
我的测试代码如下所示:void main()
{
uint8 u8a;
uint8 u8b = 3;
uint8 u8c = 10;
u8a = ++u8b + u8c--;
printf("u8a = %u, u8b = %u, u8c = %u\n", u8a, u8b, u8c);
system("pause");
}
我理解C语言操作符优先级应该为后自增/减 > 前自增减 > 加减法,理论上应该输出13,4,9。
但是使用VS2012执行以下代码输出值为14, 4 ,9。
请问是编译器的原因,或者存在什么问题吗?
你的理解基本正确,C语言操作符的优先级是后自增/减 > 前自增/减 > 加减法。根据这个规则,代码中的`++u8b`会先执行,将`u8b`的值增加到4。然后,等号右边的表达式中,`u8b`的值已经是4了,`u8c--`的操作并没有影响到它。所以,`u8a`的值等于4 + 10 = 14,`u8b`的值自增为4,`u8c`的值自减为9。
那么为什么你的输出结果不是理论上的13,4,9呢?可能是因为你对后缀自增和后缀自减操作符的使用有些混淆。在C语言中,后缀自增/减操作符的优先级比前缀自增/减低。也就是说,在一个表达式中,后缀自增/减操作符会比其他运算符先执行。但是,后缀自增/减操作符会使得变量的值在整行表达式结束后才发生变化。所以,在你的代码中,`u8c--`会在整个表达式计算完之后才生效。
如果你想要输出13,4,9,可以修改代码如下:
void main()
{
uint8 u8a;
uint8 u8b = 3;
uint8 u8c = 10;
u8a = (++u8b) + (u8c--);
printf("u8a = %u, u8b = %u, u8c = %u\n", u8a, u8b, u8c);
system("pause");
}
这样,先使用括号将后缀自增/减操作符括起来,确保它们的优先级高于加法运算符,再进行加法运算,就可以得到你期望的结果了。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 本帖最后由 tommyyu 于 2024-2-23 20:06 编辑
/*回答出了点问题*/ tommyyu 发表于 2024-2-23 19:52
是未定义行为,每个编译器的运行顺序不一样。尽量避免这样的代码。
真的吗?
那你找一个输出不是 14,4,9 的编译器看看
不要看见 ++,-- 运算符就说未定义行为
请先去弄清楚什么是未定义行为
sh-5.2$ cat main.c
#include <stdio.h>
#include <stdint.h>
int main(void) {
uint8_t u8a;
uint8_t u8b = 3;
uint8_t u8c = 10;
u8a = ++u8b + u8c--;
printf("u8a = %hhu, u8b = %hhu, u8c = %hhu\n", u8a, u8b, u8c);
return 0;
}
sh-5.2$ ./main
u8a = 14, u8b = 4, u8c = 9
sh-5.2$
人造人 发表于 2024-2-23 20:03
我再去查一查 本帖最后由 陈尚涵 于 2024-2-23 20:21 编辑
经典的新人问题
位置问题,自增和自减在变量的前与后是不同的,如果在前面,则这个表达式采用操作后的结果,否则使用操作前的
举个例子,a=3,那么++a=4,而a++=3
就是i++和++i的区别啦
求个最佳 tommyyu 发表于 2024-2-23 20:05
我再去查一查
大概整明白了,我刚刚好像看成一个变量在自增自减了{:10_302:} tommyyu 发表于 2024-2-23 20:05
我再去查一查
顺序的问题啦{:10_250:}
和i++与++i的区别是一样的道理
页:
[1]