指向结构体成员的指针上使用 ++ 运算符

4
我发现了一段代码,它的内容如下:
++myStruct->counter

我对++运算符和->运算符在这里的计算方式感到困惑。++优先于->运算符,并从左到右进行评估。看起来++运算符实际上会对'myStruct'执行指针算术运算,而不是递增计数器成员。


2
http://cs.indstate.edu/CS202/CPT.pdf -> -> 的优先级高于 ++ - Jeyaram
4
依我之见,那段代码很糟糕。并非每个程序员都能记住运算符的优先级,即使认为自己已经掌握,也不可能完美地回忆起来。代码应该改成类似 (++myStruct)->counter++(myStruct->counter) 的形式,以明确表达意图。 - Andrew Henle
2
@AndrewHenle,我非常赞同。偶尔(虽然幸好很少),你会遇到这些简短的专家,坚持认为你不应该使用比所需更多的括号。这一直是一个可怕的坏主意。使用任何你可以利用的手段来帮助在凌晨3点因咖啡因过度而疲惫不堪的工程师阅读你的代码。 - user4229245
1
@AndrewHenle 这并不比 ++foo.bar 更危险。也就是说,完全没有危险。 - n. m.
1
如果你不确定.->的相对优先级,那么你就没有资格去接触任何复杂的C代码。这是基本知识,没有任何复杂性。 - n. m.
显示剩余20条评论
3个回答

5

++ 运算符的优先级高于 -> 运算符,且从左到右进行计算。

这是不正确的——像 -> 这样的后缀运算符的优先级比一元(前缀)运算符 ++-- 更高。该表达式被解析为

++(myStruct->counter)

因此,myStructcounter 成员正在被递增。

3
< p > 后缀增量和减量与 -> 运算符具有相同的优先级和从左到右的结合性,但前缀增量和减量在之后。因此,该代码确实递增变量 counter 而不是 myStruct


3
我们在同一秒钟回答了。不错。 - Quentin

3
根据cppreference,前缀运算符++/--的优先级低于->运算符。后缀运算符具有相同的优先级,但是从左到右结合。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接