这可能是“ c++ 101”级别的问题,但有一些相关的痛苦,所以我会要求评论以保持自信。
我有一些遗留代码支持返回到c++11及之前的这一行:
iTmp = ~iTmp++;
Run Code Online (Sandbox Code Playgroud)
在代码更改为c++17之前,此方法 100% 有效。更改为c++17后,它会计算出不同的值,但并非总是如此。这取决于该行在代码中的位置,是先执行 2 的补码还是先执行增量。
另外,如果您尝试强制使用括号,则会出现编译器错误:
iTmp = (~iTmp)++;
error C2105: '++' needs l-value
Run Code Online (Sandbox Code Playgroud)
这对我来说很有意义,因为 2 的补码结果不是中间变量,因此 ++ 没有任何可操作的内容。
我的研究告诉我
我的评价正确吗?
对我来说,一个非常微妙的区别是前面的代码无效,但这一行可以:
if ( ++iTmp > 0)
Run Code Online (Sandbox Code Playgroud)
我没想到升级到c++17会导致这个微妙的错误,但我不得不将代码更改为以下内容来解决问题:
iTmp = ~iTmp;
iTmp++;
Run Code Online (Sandbox Code Playgroud)