gpt4 book ai didi

c - 了解 C 中包含 '++' 和 '->' 运算符的表达式的计算

转载 作者:行者123 更新时间:2023-12-04 11:28:26 24 4
gpt4 key购买 nike

考虑这个例子:

struct {
int num;
} s, *ps;

s.num = 0;
ps = &s;
++ps->num;

printf("%d", s.num); /* Prints 1 */

它打印1
所以我理解这是因为根据运算符的优先级,->高于++,所以值ps->num(是 0) 首先被获取,然后 ++ 运算符对其进行操作,因此它将其递增到 1。

struct {
int num;
} s, *ps;

s.num = 0;
ps = &s;
ps++->num;

printf("%d", s.num); /* Prints 0 */

在这个例子中,我得到了 0 但我不明白为什么;第一个例子的解释对于这个例子应该是一样的。但是似乎这个表达式的计算如下:
首先,运算符 ++ 进行运算,它对 ps 进行运算,因此它将其递增到下一个 struct。只有这样 -> 才会运行,它什么都不做,因为它只是获取下一个 structnum 字段,并且什么都不做。
但它与运算符的优先级相矛盾,即 -> 的优先级高于 ++

有人可以解释这种行为吗?

编辑:
在阅读了两个引用 C++ 优先级表的答案后,该表表明前缀 ++/-- 运算符的优先级低于 ->,我做了一些谷歌搜索并想出了这个 link这说明这条规则也适用于 C 本身。它完全符合并充分解释了这种行为,但我必须补充一点,此链接中的表格与我自己的 K&R ANSI C 副本中的表格相矛盾。因此,如果您对哪个来源正确有任何建议,我想知道。

谢谢。

最佳答案

后增量(ps++)和前增量(++ps)在C中有不同的结合性。前者从左到右关联,而后者从右到左关联。检查this换页(尽管这是针对 C++ 的,因此优先级可能会产生误导)。

在您的最后一个示例中,您将指针更改为指向 &s 末尾的指针。 .您没有更改指针对象的值。如果你需要增加 num , 你需要绑定(bind) ++num .

详细解释:

 ps++->num;

看到这个表达式的(假设的)编译器可能会推送 ps对象到堆栈,后跟 ++运算符,->运算符,最后是对象 -- num .在评估时,编译器应该从哪里开始?它查看可用的运算符,即 ++-> .它是否选择ps++ps ?这里的优先规则:自 ->优先级高于 ++ , 它需要 ->num 处理作为一个操作数和 ps作为另一个操作数。因此,表达式的值变为 ps->num即你正确观察到的 0。 ps 发生了什么评估后?还记得,堆栈上还剩下另一个运算符吗?因此,编译器将其应用于 ps它现在指向过去的一个元素 &s .

脚注:

ANSI/ISO C 标准不使用运算符优先语法。相反,它使用所谓的全分解语法。这通常涉及一个精确的语法定义,上面点缀着许多非终结符,如“primary-expression”和“shift-expression”等。这很难理解,但对于语言设计者或编译器供应商来说更容易理解。此外,这样的语法能够轻松地对优先级进行编码。然而,任何完全分解的语法都与运算符优先语法兼容,这是大多数书籍(和网站)所做的(有时也会搞砸)。

关于c - 了解 C 中包含 '++' 和 '->' 运算符的表达式的计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/776512/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com