2016-09-13 7 views
1

Прежде всего, это небольшая программа, которую я сделал:Сумма двух символов

#include <stdio.h> 
int main(void) { 
    char z = '"' + '!'; 
    printf("%c\n", z); 
    return 0; 
} 

Консоль дает мне «C». Поэтому я считаю, что это нормально. Я читал, что когда мы вычисляем символы, они превращаются в десятичное значение.

ASCII ----> decimal 
'"' ----> 34 
'!"----> 33 

34 + 33 = 67 
C-----> 67 

Все выглядит нормально.

Но, когда я пытаюсь сделать: 'a' + 'b', это дает мне '\ 303'. Зачем?

a ---> 97 
b ---> 98 

97 + 98 = 195. 

195 вне таблицы ASCII, поэтому я ожидал получить сообщение об ошибке.

Заранее благодарю вас за помощь и благодарность за подробный о моем сломанном английском языке!

+0

Что именно печатает? Это может зависеть от вашего набора кодировок. – Artyom

+0

«когда мы вычисляем символы, которые они превращают в десятичное значение»: Да, текст отсутствует, но закодирован. Знание того, какой набор символов и кодировка используется, может быть чрезвычайно важным - и, вероятно, это не ASCII. Сделайте 'locale' или' chcp' в своей консоли. BTW - '\ 303' - 195. –

+0

все значения char от -128 до 127 можно печатать (char в значении знака в диапазоне [-128, 127]). Следующий код распечатывает все: 'int z; for (z = 0; z <256; z ++) printf ("% c \ n ", (char) z);'. '(char) (97 + 98)' равно '-61' из-за переполнения. – Rotem

ответ

-1

К сожалению, это не даст сообщение об ошибке. Как и в случае с C, вместо ошибок он имеет «неопределенное поведение», что затрудняет отладку множества проблем, поскольку оно синтаксически корректно, но технически неправильно. Это большая причина, по которой исключения были добавлены в C++, но это выходит из темы.

Как уже упоминалось в комментариях, 'a' + 'b' на самом деле составляет 195, что в восьмеричном состоянии составляет 303. Переинтерпретация знака 195 с подписанным значением равна -61 (подробнее об этом см. Ниже). В обоих случаях они находятся вне диапазона печати для символов ascii. На моей консоли он печатает , но это нестандартно, разные консоли будут печатать разные вещи там.

Исправление состоит в том, чтобы удостовериться, что вы передаете значимые данные printf перед его вызовом, и не ожидайте, что printf выполнит работу по его обнаружению.

Замечание: вы должны включить все предупреждения с вашим компилятором, они часто улавливают многие из этих проблем.

Сторона примечания 2: если 'a' + 'b' дал signed char, тогда это будет -61, но на самом деле это 32-битный int. Вы можете проверить это с возвратом sizeof('a' + 'b') 4. Таким образом, напечатанное число равно 195, которое по-прежнему не соответствует допустимому символу в таблице ASCII.

+2

Здесь нет неопределенного поведения в 'printf()'.«Реинтерпретация без знака 195 с подписанным значением равна -61». mis-ведет, поскольку сумма не является неподписанной, а 'int'. «разные консоли будут печатать разные вещи там» - это правда, но это не неопределенное поведение, а конкретное поведение реализации. 'printf ("% c \ n ", 195);' определяется в C как "... аргумент' int' преобразуется в 'unsigned char', и результирующий символ записывается." Поэтому «исправление заключается в том, чтобы убедиться, что вы передаете действительные данные printf перед его вызовом», не является _fix_. – chux

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