任何人都可以解释以下程序的输出:
#include <iostream>
using namespace std;
int main()
{
int test = 0;
cout << "First character " << '1' << endl;
cout << "Second character " << (test ? 3 : '1') << endl;
return 0;
}
输出:
第一个字符1
第二个角色49
但是printf
语句都应该打印相同的行。
答案 0 :(得分:34)
表达式'1'
的类型为char
。
表达式(test ? 3 : '1')
的类型至少为int
(或其无符号版本;便携式为std::common_type_t<int, char>
)。
因此<<
运算符的两次调用选择不同的重载:前者按原样打印字符,后者将整数格式化为十进制字符串表示。 (字符'1'
的整数值由基本字符集定义。)
答案 1 :(得分:5)
cout
后, (test ? 3 : '1')
会显示<<operator
表达式的值。在这种情况下,它是int
,您可以使用Scott Meyers在newest book中传播的好技巧来检查它:
template < typename T > class TD; // Type Displayer
int main()
{
int test = 0;
TD<decltype((test ? 3 : '1'))> xType;
return 0;
}
这会产生错误,这也会为您提供表达类型的信息:
main.cpp:6:34:错误:聚合'TD&lt; int &gt; xType'具有不完整的类型和 无法定义 TD xType;
是int
。而static_cast<int>('1')
是49。