Как избежать (потенциальной) ошибки путем преобразования при назначении символа символу с тернарным оператором

У меня есть следующий код:

void foo(char* char_ptr, unsigned short len) {
    char c = len != 0 ? char_ptr[0] : '\0';
    printf("%c", c);
}

Я получаю следующее предупреждение:

Clang-Tidy: сужение преобразования из «int» в знаковый тип «char» определяется реализацией.

О какой конверсии идет речь? У меня везде только chars. Как я могу избежать этой (потенциальной) ошибки? Это похоже на еще один случай «происходит какая-то неявная магия, о которой вам просто нужно знать». Есть ли место, где я могу найти всю магию, которую неявно делает c-компилятор?

Re «Есть ли место, где я могу найти всю магию, которую неявно делает c-компилятор?»: Начните с стандарта C.

Eric Postpischil 20.12.2020 16:53

@EricPostpischil приведение только «\ 0» не отключает предупреждение. Как странно, что литерал с одинарными кавычками — это int, а не char!

David 20.12.2020 16:59

@AdrianMole, выполняя все заявление, отключает предупреждение, спасибо

David 20.12.2020 16:59
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
1
3
202
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Интерпретируя информацию с этой страницы cppreference, а именно в разделе «Условный оператор», подразделы (3) и (1), мы видим:

(3) Выполняет преобразование результата оценки в общий тип, определяемый следующим образом:

(1) если выражения имеют арифметику тип, общий тип — это тип после обычных арифметических преобразований

Затем, глядя на связанные «обычные арифметические преобразования», мы видим:

(4) В противном случае оба операнда являются целыми числами. Оба операнда подвергаются целочисленные акции (см. ниже); затем, ...

Эти целочисленные преобразования приведут к тому, что оба выражения будут преобразованы в типы int, даже если вы явно примените второе, как в char c = len != 0 ? char_ptr[0] : (char)'\0';.

Итак, чтобы отключить предупреждение, результат условного выражения (который будет иметь тип int) должен быть приведен к char, как в:

    char c = (char)(len != 0 ? char_ptr[0] : '\0');

Из этого проекта стандарта C11

6.5.15 Условный оператор
...
5 Если и второй, и третий операнд имеют арифметический тип, тип результата, который будет определяться обычные арифметические преобразования, применялись ли они к этим двум операндам, является типом результата.

Что, по-видимому, подтверждает информацию, представленную cppreference.com.

Другие вопросы по теме