找回密码
 欢迎注册
查看: 3967|回复: 18

[讨论] 为什么 -++i 可以编译,而 ---i 却不可以?

[复制链接]
发表于 2023-12-25 16:15:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
所讨论的语言为 C++

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

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

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

现在纯粹是讨论:为什么 -++i 可以,而 ---i 却不可以通过编译?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2023-12-25 16:30:20 | 显示全部楼层
---i 表示-(--i)还是--(-i)呀?????????
能加括号就加括号,不要自己折腾自己!

还有,你的啥操作系统?啥编译器呀?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2023-12-25 16:31:44 | 显示全部楼层
不懂就去看汇编,这个应该会吧!

点评

本末倒置。编译不过,哪来汇编?  发表于 2023-12-25 16:39
nyy
把c++转化成汇编看  发表于 2023-12-25 16:31
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2023-12-26 08:38:08 | 显示全部楼层
nyy 发表于 2023-12-25 16:30
---i 表示-(--i)还是--(-i)呀?????????
能加括号就加括号,不要自己折腾自己!

还可以理解成-(-(-i)),你人都理解不了的东西,而况乎机器?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2023-12-26 08:39:26 | 显示全部楼层
你的 -++i ,机器是怎么理解的?
是-(++i),还是-(+(+i))?

点评

nyy
都快50了,居然还在码代码,没招个小弟码代码?  发表于 2023-12-26 08:40
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 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),这就要看编译器此法分析的顺序了。

点评

搞错了,-(+(+i))也是合法的。  发表于 2023-12-26 09:49
nyy
解释成-(+(+i))为什么不合法,最多是被机器优先解释成了-(++i),但是你不能说-(+(+i))不合法  发表于 2023-12-26 09:48
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2023-12-30 21:23:46 | 显示全部楼层
我记得是i--
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2024-1-2 09:54:00 | 显示全部楼层
我认为是这样的,在编译之前,需要进行解析,一般是从左至右逐字符进行解析。

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

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

点评

nyy
郭老板,招个小弟吧,这样你就轻松了,你要学会当资本家  发表于 2024-1-2 10:58
nyy
瞎折腾,加括号解决问题。招几个小弟给你码代码。你们公司招人难吗?  发表于 2024-1-2 10:42
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2024-6-7 11:15:40 | 显示全部楼层
老老实实加括号,别玩这种花活了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2024-6-15 14:43:37 | 显示全部楼层
感觉是词法分析立功
---i会被直接分词成-- 和-i
于是报错
因为词法分析在语法分析之前,所以词法分析器并不会试图理解你的---到底是- --还是-- -,只会按默认规则,认为--是一个词, 剩下的-是另一个词

想避免错误又不想写括号,可以写成- --i
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-12-22 00:51 , Processed in 0.025447 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表