c++ - 关于 C++ 中的移位运算符技巧?

标签 c++

当我在阅读Google Protocol Buffers中的代码时,我发现了如下困惑的代码。

1 < 2 ? (void)0 : cout << "hi" << endl;

重点是字符串“hi”将通过左移运算符通过 NULL 传递。结果,什么也没有发生。这意味着这在语法上是正确的代码。

我尝试了一些不同的代码,如下所示。

(void)0 << "hi" << endl;

当然,它没有用。

最后,我尝试了这段代码。

string tmp;
cin >> (1 < 2 ? 0 : tmp);

它已编译但在运行时崩溃。 (如果符号被反转但输入不存储在 tmp 中,它会起作用。)

有没有人可以告诉我第一种情况会发生什么? (就编译器或低级别而言,如果可能的话)

最佳答案

你误会了,1 < 2 ? (void)0 : cout << "hi" << endl;翻译成:

if(1 < 2) {
    (void)0; //do nothing
} else {
    cout << "hi" << endl;
}

condition ? true-state : false-state;称为 ternary operator ,它绝对与<<无关.

关于c++ - 关于 C++ 中的移位运算符技巧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21717059/

相关文章:

c++ - 如何强制加载/创建 dll 的 pdb 文件

c++ - 如何摆脱这个构造函数错误?

c++ - 如何最好地为 Visual Studio 2017 构建的 CMake C++ 项目设置输出目录?

c++ - 将 UINT16 值转换为 UINT8 数组[2]

c++ - BOOST_CHECK_EQUAL 与 pair<int, int> 和自定义运算符 <<

c++ - Visual Studio 在 Debug 中编译,失败 Release ("Cannot open include file")

c++ - ATL 如何将 BSTR* str 转换为注册表项。SetValue(LPCTSTR str 类型

c++ - 使用自定义提取运算符时出现错误 C2679

c++ - 在模板化类中初始化私有(private)成员变量 vector

c++ - Visual Studio 2012 C++ Windows 32