Подтвердить что ты не робот

Тип тройного выражения

Может кто-нибудь объяснить вывод следующей программы:

#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 должны печатать одну и ту же строку.

4b9b3361

Ответ 1

Тип выражения '1' равен char.

Тип выражения (test ? 3 : '1') не менее int (или его неподписанная версия, возможно, это std::common_type_t<int, char>).

Поэтому две вызовы оператора << выбирают разные перегрузки: первая печатает символ как есть, последний форматирует целое число как его десятичное строковое представление. (Интегральное значение символа '1' определяется вашим базовым набором символов.)

Ответ 2

cout отобразит значение выражения (test ? 3 : '1') после выведения соответствующего <<operator. В этом случае это int, вы можете проверить его, используя хороший трюк, который Скотт Мейерс распространил в своей самой новой книге:

template < typename T > class TD; // Type Displayer
int main()
{
  int test = 0;
  TD<decltype((test ? 3 : '1'))> xType; 

  return 0;
}

это генерирует ошибку, которая также даст вам информацию о типе вашего выражения:

main.cpp: 6: 34: error: aggregate 'TD < int > xType' имеет неполный тип и не может быть определено    TD xType;

который равен int. И static_cast<int>('1') равно 49.