#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.