c не выдает предупреждения или ошибки, когда целое число передается в функцию, у которой есть аргументы char

#c #compilation

Вопрос:

Почему c не выдает предупреждений или ошибок, когда целое число передается функции, которая принимает аргументы char.

 void test(char a) {
    std::cout << a;
}


test(1);
 

Я бы получил неожиданное поведение при этом(т. Е. ? печатается). Но я ожидал, что это будет ошибка или, по крайней мере, предупреждение о компиляции, так как происходило какое-то приведение. Почему этого не происходит?

Комментарии:

1. 1-это не » 1 » (обычно = 49), но все еще допустимое значение символа.

2. о, понял, чувствую себя сейчас таким глупым

3. int может неявно преобразовываться в char и наоборот. int i = '0'; является допустимым кодом и был полезен мне в прошлом

4. Некоторые компиляторы предупредят — зависит от переданного значения — live — godbolt.org/z/TK6h87cjd

5. В коде нет приведения . Происходит обращение . Приведение-это то, что вы пишете в своем исходном коде, чтобы указать компилятору выполнить преобразование.

Ответ №1:

Я не совсем понимаю, зачем c разрешать здесь неявное преобразование, возможно, потому, что это хорошо для работы с необработанной памятью.


За то, почему вы получаете неожиданное поведение

1 является ли допустимым контрольный код, такой как '' или 'n'

в то время как вы должны использовать '1' (или 49 , предположим, ASCII или совместимый формат)


Компилятор предупредит, если он не подходит.

 void test(char c);
void F(){test(1);} // OK
void G(){test(10000);} // warning 
void H(int v){test(v);} // need -Wconversion
 

Обозреватель компиляторов

Комментарии:

1. Не используйте 49; не принимайте ASCII. В этом нет необходимости.

2. @PeteBecker ну , вероятно, в этом нет необходимости '1' , но нужно предположить (или указать) кодировку, особенно для Unicode.