迷路的狍子 发表于 2024-2-23 18:46:06

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。

请问是编译器的原因,或者存在什么问题吗?

FishC 发表于 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,可以修改代码如下:

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 19:52:11

本帖最后由 tommyyu 于 2024-2-23 20:06 编辑

/*回答出了点问题*/

人造人 发表于 2024-2-23 20:03:57

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$

tommyyu 发表于 2024-2-23 20:05:16

人造人 发表于 2024-2-23 20:03


我再去查一查

陈尚涵 发表于 2024-2-23 20:16:53

本帖最后由 陈尚涵 于 2024-2-23 20:21 编辑

经典的新人问题
位置问题,自增和自减在变量的前与后是不同的,如果在前面,则这个表达式采用操作后的结果,否则使用操作前的
举个例子,a=3,那么++a=4,而a++=3
就是i++和++i的区别啦
求个最佳

tommyyu 发表于 2024-2-23 20:17:34

tommyyu 发表于 2024-2-23 20:05
我再去查一查

大概整明白了,我刚刚好像看成一个变量在自增自减了{:10_302:}

陈尚涵 发表于 2024-2-23 20:17:43

tommyyu 发表于 2024-2-23 20:05
我再去查一查

顺序的问题啦{:10_250:}
和i++与++i的区别是一样的道理
页: [1]
查看完整版本: C语言操作符优先级疑问