gxqcn 发表于 2023-12-25 16:15:13

为什么 -++i 可以编译,而 ---i 却不可以?

所讨论的语言为 C++

其中,i 是 有符号整型数据类型,-++i 的结合性为从右到左,先算 ++i,而后取负;
++i 为自增运算,对等的自减运算为 --i,但为什么 ---i 却编译不过?

似乎将 ---i 解析成了 --(-i),-i 返回的是一个右值,而自减运算必须针对的是可修改的左值,所以报错。

抛出这个问题,不是推荐大家写出类似代码,该加括号就加括号,比如改写成 -(--i),
不仅提高可阅读性,也避免解析的结果与预期不符。

现在纯粹是讨论:为什么 -++i 可以,而 ---i 却不可以通过编译?

nyy 发表于 2023-12-25 16:30:20

---i 表示-(--i)还是--(-i)呀?????????
能加括号就加括号,不要自己折腾自己!

还有,你的啥操作系统?啥编译器呀?

nyy 发表于 2023-12-25 16:31:44

不懂就去看汇编,这个应该会吧!

nyy 发表于 2023-12-26 08:38:08

nyy 发表于 2023-12-25 16:30
---i 表示-(--i)还是--(-i)呀?????????
能加括号就加括号,不要自己折腾自己!



还可以理解成-(-(-i)),你人都理解不了的东西,而况乎机器?

nyy 发表于 2023-12-26 08:39:26

你的 -++i ,机器是怎么理解的?
是-(++i),还是-(+(+i))?

风云剑 发表于 2023-12-26 09:42:46

本帖最后由 风云剑 于 2023-12-26 09:48 编辑

nyy 发表于 2023-12-26 08:39
你的 -++i ,机器是怎么理解的?
是-(++i),还是-(+(+i))?

-++i是-(++i),因为++是一个合法的运算,编译器不会去解释成+(+i)。
同样+--i也是合法的。
但---i和+++i这种,则存在语义模糊,因为存在两种合法的解释--(-i)和-(--i),这就要看编译器此法分析的顺序了。

lihpb00 发表于 2023-12-30 21:23:46

我记得是i--

gxqcn 发表于 2024-1-2 09:54:00

我认为是这样的,在编译之前,需要进行解析,一般是从左至右逐字符进行解析。

对于 -++i,先解析到 -,再解析到 -+,由于不存在 -+ 运算符,所以缓存 -,继续后面的解析,得到 -, ++, i,而 -, ++ 的优先级是同级的,按结合性从右到左,先算 ++i,而后取负,OK;
而对于 ---i,先解析到 -,再解析为 --,由于存在 -- 运算符,所以缓存之;继续后面的解析,得到 --, -, i,由于 --, - 的优先级是同级的,按结合性从右到左,先算 -i,而后自减,但此时是个右值,所以报错。

虽然 ---i 编译报错,但再删除/新增一个 - 符号,又可编译了:--i 为自减运算,----i 为双自减运算,即自减两次的运算,按上述的解释即说得通了。

LLPikaPika 发表于 2024-6-7 11:15:40

老老实实加括号,别玩这种花活了

.·.·. 发表于 2024-6-15 14:43:37

感觉是词法分析立功
---i会被直接分词成-- 和-i
于是报错
因为词法分析在语法分析之前,所以词法分析器并不会试图理解你的---到底是- --还是-- -,只会按默认规则,认为--是一个词, 剩下的-是另一个词

想避免错误又不想写括号,可以写成- --i
页: [1] 2
查看完整版本: 为什么 -++i 可以编译,而 ---i 却不可以?