c++ - 编译器如何在 if 语句中使用多个比较运算符评估表达式?
问题描述
所以我有这个程序返回“结果:真”
if (true == false != true) {
cout << "result: true";
}
else {
cout << "result: false";
}
即使我们翻转 if 语句中的比较运算符,编译器仍然会将表达式评估为真
if (true != false == true)
我的问题是:
- 编译器如何实际评估表达式?
- 以及在 if 语句中存在的两个比较运算符中,哪个比较运算符优先?
解决方案
您的两个问题的答案都是运算符优先级。==
和运算符具有相同的!=
优先级,这意味着它们将按照给定的顺序进行评估。
所以 in true == false != true
, 被评估为(true == false) != true
第一个语句true==false
为假,完整的语句现在变为false!=true
评估为true
同样,第 2 条语句true != false == true
变为(true != false) == true
最后评估true
为
编辑:
在阅读了@Pete 的评论后,我又做了一些阅读。显然存在与这些情况相关的关联性
来自https://en.cppreference.com/w/cpp/language/operator_precedence
具有相同优先级的运算符在它们的关联性方向上绑定到它们的参数。例如,表达式 a = b = c 被解析为 a = (b = c),而不是 (a = b) = c,因为赋值的从右到左关联性,但 a + b - c 被解析(a + b) - c 而不是 a + (b - c),因为加法和减法的从左到右的关联性。
推荐阅读
- java - 即使配置了 SDK,也没有可用的 Java
- javascript - 是否可以将 selenium 中的 js PROMISE 值作为变量返回?
- python - 如何使用 univ_pos 参数实现 spacy lemmatizer
- react-native - 使用 RN-FETCH-BLOB 下载 mp3 文件
- c++ - C++ D&D 点购买 - 点跟踪?
- android - 蓝牙 5 Android 扫描 Phy 编码寡妇/间隔 - 延迟
- java - 似乎 xpath translate 在 java8 中无法按预期工作
- r - 下载 Shiny 中已经存在的 excel 文件
- php - 在 php 中,使用连接运算符 (.) 向数组添加值的目的是什么?
- service - 为什么在清单中使用固定网址进行预缓存?