Почему приведение типа не удалось только в этом предложении? - PullRequest
0 голосов
/ 28 апреля 2018

Я столкнулся с этим, когда попытался напечатать шестнадцатеричное число по этому предложению:

cout << (a > 9 ? (char)('A' + a - 10) : a);

Однако, когда a > 9, он печатает целое число, а не символ. но

cout << (char)('A' + a - 10);

работал хорошо. Почему дела идут так? Как я могу решить это? Спасибо за любую подсказку.

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

Тип выражения определяется во время компиляции, он не может зависеть от условий выполнения. Когда два результирующих выражения в условном (иначе говоря, третичном) выражении различаются, они должны быть преобразованы в общий тип, и это тип выражения в целом. Подробнее см. Тип возврата '?:' (Троичный условный оператор) .

В вашем случае a предположительно int, а (char)('A' + a - 10) - char, поэтому общий тип - int, поэтому cout использует свой метод для печати int вместо char.

Вместо третичного, используйте обычный if:

if (a > 9) {
    cout << static_cast<char>('A' + a - 10);
} else {
    cout << a;
}

Или приведите к char после выполнения условного.

cout << static_cast<char>(a > 9 ? ('A' + a - 10) : ('0' + a));
0 голосов
/ 28 апреля 2018

Попробуйте это

cout << (char)(a > 9 ? ('A' + a - 10) : a + '0');

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...