VS2008 中“<<”和“++”的运算符优先级优化

2024-01-03

我遇到了一个奇怪的 VS2008 C++ 问题,看起来运算符优先级没有得到尊重。

我的问题是这个的输出是什么:

int i = 0;  
std::cout << ((i != 0) ? "Not zero " : "zero ") << ++i << std::endl;  

通常情况下++优先于<<, 正确的?或者是<<被视为函数调用,其优先级高于++? 100%正确的标准答案是什么?

为了进行检查,我创建了一个新的空项目(VS2008 控制台应用程序),仅将此代码粘贴到主项目中,结果如下:

Debug|Win32: “zero 1”  
Release|Win32: “zero 1”  
Debug|x64: “zero 1”  
Release|x64: “Not zero 1”

顺便说一句,以下示例产生完全相同的结果:

i = 0;  
printf("%s %d\n", ((i != 0) ? "Not zero" : "zero"), ++i);  

并且在发布中更改优化类型也没有效果,但像其他配置一样禁用优化输出“零1”。


这与运算符优先级无关。
您正在使用

std::cout << ((i != 0) ? "Not zero " : "zero ") << ++i << std::endl; 

// Equivalent to:

operator<<(operator<<(operator<<(std::cout, ((i != 0) ? "Not zero " : "zero ")), ++i), std::endl);

这里唯一的规则是在调用函数之前必须对参数进行完全评估。对于参数的求值顺序没有限制,即使它们的求值与调用交错(甚至部分求值)也是如此。

解读一:

1) ((i != 0) ? "Not zero " : "zero "))
2) ++i
3) operator<<(std::cout, (1));
4) operator<<((3), (2));
5) operator<<((4), std::endl);

注意:限制是:

 A) (1) happens before (3)
 B) (2) happens before (4)
 C) (3) happens before (4)
 D) (4) happens before (5)

鉴于这些限制,我们可以按如下方式重新排序。

解读2:

1) ++i
2) ((i != 0) ? "Not zero " : "zero "))
3) operator<<(std::cout, (2));
4) operator<<((3), (1));
5) operator<<((4), std::endl);

解读3:

1) ((i != 0) ? "Not zero " : "zero "))
2) operator<<(std::cout, (1));
3) ++i
4) operator<<((2), (3));
5) operator<<((4), std::endl);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VS2008 中“<<”和“++”的运算符优先级优化 的相关文章

随机推荐

  • 构造函数内的 Try/catch 块

    在构造函数中使用 try catch 块是一种不好的编程习惯吗 或者只要我们的程序优雅地处理类型初始化器异常就没有什么区别 在 C 中 如果构造函数内有任何异常 框架总是会抛出 typeinitilizer 异常 谢谢 沙米卡 System
  • 随机化数组的有效方法 - Shuffle 代码

    我在面试中被问到这个问题 我给出了各种解决方案 但面试官并不相信 我有兴趣找到解决方案 请提出您的看法 问 编写一个高效的数据结构来实现 ipod 中的 shuffle 它必须播放所有歌曲 每次以不同的随机顺序播放 同一首歌曲不应重复 大部
  • 将 GitLab CI 变量写入文件

    我如何将 GitLab CI 变量写入配置文件 如下所示 test stage test script touch config json echo database DB NAME gt gt config json 变量无法解决 我总是
  • 如何在 Mac 10.8.3 上安装 qpdf?

    跑步时R CMD check在 Mac 构建服务器上的包上 我收到警告 qpdf is needed for checks on size reduction of PDFs 我似乎无法得到qpdf http sourceforge net
  • 自定义 SQL GROUP BY 子句

    我有一个非常定制的 SQL 查询 但在实现时遇到问题 我正在使用 SQL Server 2008 我在此查询中只有一张表 但我正在寻找非常具体的数据 该查询的要求是 对于每个不同的 PartNumber 列 我需要选择要选择的最新 最大 P
  • 如何让 LINQ 全外连接正常运行?

    我正在构建一个 WPF 应用程序来监视用户计算机上的目录 该应用程序从受监控的目录上传文件 然后将一些信息保存到 SQLite 数据库中 部分业务处理是对已经上传的文件不重新处理 对已经上传但自上次上传后发生变化的文件重新上传 我有两个构建
  • 在 C++ 中将值从 X 更改为 X 会导致数据争用吗?

    我有可处理具有不同布局的大数据块的代码 布局将决定哪些数据是固定的 哪些数据是不固定的 一旦数据被固定在一个块中 它通常就不会再改变 所以所有读取数据的代码总是会看到相同的数据 但是 其他服务可以在这些块中进行更改 只要它们确定没有代码将读
  • 如何扩展 Phaser 3 游戏及其资产以使其在智能手机和平板电脑上运行?

    我刚开始使用 Phaser 3 和 Apache C rdova 创建移动 Android 游戏 我创建了一个 1200 x 800 像素的游戏 它在平板电脑上看起来不错 但在智能手机上却不然 如何缩放它以适应多种屏幕尺寸 此外 我需要帮助
  • Sencha touch 2:在itemTpl中获取项目索引

    在XTemplate的文档中 可以使用 来获取当前数组索引 当我在 xlist 的 itemTpl 中使用它时 我总是得到 1 而不是索引 xtype list store myStore itemTpl new Ext XTemplate
  • 多个项目和一种解决方案有什么好处? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在 this(...) 或 super(...) 之前“插入”代码?

    有没有办法在调用之前进行初步计算super or this 构造函数 考虑以下示例 public class Test private final int n private final int m private final int st
  • 使用 JUnit 5 并行执行测试用例

    是否可以与 JUnit 5 并行执行测试用例 我正在寻找类似的东西threadPoolSize and invocationCount from TestNG http testng org doc documentation main h
  • 为 string.Contains 构建表达式树[重复]

    这个问题在这里已经有答案了 我正在努力构建一个表达式树 以便我可以动态地对某些数据进行过滤 我已经想出了这个 但它失败了var lambda line foreach var rule in request Where Rules var
  • 是什么使 Bean 成为 CDI Bean?

    例如 在这个问题的最佳答案中 Java EE 6 javax annotation ManagedBean 与 javax inject Named 与 javax faces ManagedBean https stackoverflow
  • 空类构造函数(样式)

    什么是定义不需要任何构造函数参数的类的 Pythonic 方法 class MyClass class body 或者我们需要一个显式的构造函数吗 IE class MyClass def init pass class body 您的第一
  • 视频缩略图

    我正在开发一个人们可以提交视频链接的网站 然后我就嵌入它 但是 我想获取视频的缩略图而不将视频保存在我的服务器中 这样当我列出视频时 我可以使用缩略图而不是嵌入所有视频 我的服务使用 PHP 假设视频为 SWF 格式 或标签中是否有任何内容
  • CKEditor - 无工具栏

    所以我得到了一个textarea with CKEditor插件 但我只想让它干净 没有任何东西 没有工具栏 没有状态栏或任何栏 这很简单 但我在文档或网络上找不到它 My CKEditor开始于 texto ckeditor skin o
  • 升级到 Swift 3 后,属性“self.delegate”未在 super.init 调用中初始化

    升级到 Swift 3 后 我现在收到此错误 属性 self delegate 未在 super init 调用时初始化 在 NSObject 类上定义 open class NSObject NSObjectProtocol public
  • Android Oreo WebView 在第二次加载后渲染布局太小

    在某些 Android Oreo 设备上 当我第一次在 webview 上加载 url 时 URL 页面会正确加载 但是 当我再次加载 URL 时 页面会缩小 在低于 android oreo 的设备上 页面可以为所有设备正确加载 此外 当
  • VS2008 中“<<”和“++”的运算符优先级优化

    我遇到了一个奇怪的 VS2008 C 问题 看起来运算符优先级没有得到尊重 我的问题是这个的输出是什么 int i 0 std cout lt lt i 0 Not zero zero lt lt i lt lt std endl 通常情况