三元表达式的类型

时间:2015-05-03 20:11:20

标签: c++ ternary-operator cout

任何人都可以解释以下程序的输出:

#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语句都应该打印相同的行。

2 个答案:

答案 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。