c++ - 将三元运算符用作 cout 的参数时添加/不添加括号的区别
问题描述
这个问题显然不是这个的重复。在原始页面中,我发现这两个代码片段似乎给出了相互矛盾的原因,我的目的是弄清楚这一点,而不仅仅是了解this中给出的内容。
我必须编辑这个问题多少次才能让大家相信这个问题不是这个问题的重复。请完整阅读我的问题以及我提供的参考页面。他们在那里解释错了,我需要澄清一下。不只是一般地了解 cout 。
我在此页面中遇到了以下两个代码片段。
第一个片段:
#include <iostream>
using namespace std;
int main()
{
int test = 0;
cout << test ? "A String" : 0 << endl;
return 0;
}
第二个片段:
#include <iostream>
using namespace std;
int main()
{
int test = 0;
cout << (test ? "A String" : 0) << endl;
return 0;
}
它在那里说第一个代码片段肯定会引发编译错误,但第二个代码片段可能会或可能不会编译。
我看不出两者有什么区别。如果有区别,请解释一下。在页面的解释中,他们似乎给出了相互矛盾的理由。我需要澄清这一点。
我不明白为什么这个问题一直得到反对票,而没有人将其标记为重复,也没有人正确回答。
解决方案
具有运算符优先级,
cout << test ? "A String" : 0 << endl;
是
(cout << test) ? "A String" : (0 << endl);
无效0 << endl
(并且不是三元的预期条件)。
然而
cout << (test ? "A String" : 0) << endl;
是你所期望的。
三元运算符的类型将const char*
是以下常见类型:
"A String"
(const char[9]
)。- 字面
0
量(static_cast<const char*>(nullptr)
在这种情况下是这样,而不是int
)。
推荐阅读
- r - 根据重复的 ID 变量删除 NA
- javascript - 将innerHTML保存到文本文件时换行符我在保存的文本文件中或重新加载页面时自动获得换行符
- javascript - 测试 Angular 的 index.html 页面是否可行?
- c# - 映射 IEnumerable 时如何映射自定义属性
- c++ - 错误 C2440:“正在初始化”:无法从“const char *”转换为“TCHAR *”
- jenkins - 如何逃脱 - (连字符)使用 groovy 语言
- r - 使用建议的起始值从长转换为宽的问题
- hashicorp-vault - Hashicorp Vault 快照解密
- angular-material - 如何向有角度的材质滑块(垫滑块)添加额外的静态拇指标签?
- azure-data-explorer - Azure 数据资源管理器摄取,DeleteSourceOnSuccess 不起作用