Использование символа backsla sh (\) в выражении присваивания символа - PullRequest
0 голосов
/ 28 марта 2020
char C = '\1'
int I = -3
printf("%d", I * C);

output:

-3

Привет, я только что увидел этот странный синтаксис в своей книге практики, но он не дает мне подробных сведений о том, что это такое и как его использовать. Почему в кавычках есть обратная косая черта sh рядом с 1? '\1' отличается от '1'? Если так, то почему результат I * C такой же, как 1 * 3? Спасибо

Ответы [ 3 ]

2 голосов
/ 28 марта 2020

'1' - это символ «1». В настоящее время большинство платформ используют ASCII для перевода символов в байты - '1' в ASCII представляет собой целое число 49 в десятичном виде или 0x31 в шестнадцатеричном.

из cppreference escape-последовательность :

\nnn  arbitrary octal value   byte nnn

Восьмеричные escape-последовательности имеют ограничение в три восьмеричных цифры, но заканчиваются на первом символе, который не является действительным восьмеричным di git, если встречается раньше.

'\1' - это целое число 0x1 в шестнадцатеричном или 1 в десятичном виде. В ASCII это символ SOH - начало заголовка.

:

char C = '\1';

эквивалентно:

char C = 1;
1 голос
/ 28 марта 2020

В инициализаторе переменной C

char C = '\1';

используется восьмеричная escape-последовательность. То есть цифры после обратного знака sh считаются восьмеричным представлением числа.

Количество цифр в восьмеричной escape-последовательности не должно превышать 3, а допустимые цифры 0-7 включительно .

Например, это объявление

char C = '\11';

инициализирует переменную C значением 9.

Таким образом, выражение используется в вызове printf

printf("%d", I * C);

эквивалентно

printf("%d", -3 * 1);

И на выходе будет -3.

Вместо восьмеричной восьмеричной последовательности вы можете использовать шестнадцатеричную escape-последовательность, такую ​​как

char C = '\x1';

это объявление эквивалентно предыдущему объявлению переменной C подобно

char C = '\1';

Если инициализировать переменную как

char C = '\x11';

, тогда переменная C получит значение 17.

Количество цифр в восьмеричной escape-последовательности не должно превышать 3, а допустимые цифры - 0-7 включительно.

Что касается декларация, подобная этой

char C = '1';

затем переменная C инициализируется значением внутреннего представления символа '1'. Например, если используется кодировка ASCII, переменная C инициализируется значением 49. Если используется кодировка EBCDI C, то переменная C инициализируется значением 241.

0 голосов
/ 28 марта 2020

'1' является внутренним байтом, значение которого равно 49 (код ASCII символа 1).
'\1' является байтом, значение которого равно 1.

...