2015-05-03 3 views
31

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

#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 заявления должны напечатать такой же линия.

+4

Это хороший вопрос, но не связанный с побочными эффектами. – juanchopanza

ответ

34

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

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

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

5

cout будет отображать значение выражения (test ? 3 : '1') после выведения соответствующего <<operator. В этом случае int, вы можете проверить его с помощью хорошего трюка, Скотт Мейерс, распространяющегося в Его 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: error: aggregate 'TD<int> xType' has incomplete type and cannot be defined TD xType;

который является int. И static_cast<int>('1') - 49.

+2

'static_cast ('1')' 49 на многих системах, но это не требуется. Есть системы, где это не так. –

+0

IIIRC, строковые литералы/символы не обязательно должны быть в формате ASCII, если вы не укажете формат (например, 'u8'). В этом тоже должен быть вопрос. – edmz

Смежные вопросы