Неожиданный вывод в программе C при печати

avatar
Aditya Mishra
9 августа 2021 в 03:12
178
2
1

Предположим, что включены все заголовочные файлы.

void main() { 
int i; 
clrscr(); 
printf("india"-'A'+'B'); 
getch(); }

Вывод следующей функции: ndia

Кто-нибудь может объяснить мне этот вывод?

Источник
paddy
9 августа 2021 в 03:19
1

Арифметика указателя. Почему бы вам не объяснить, что вы ожидаете?

klutt
9 августа 2021 в 03:53
0

Выражение "india"-'A'+'B' вообще не имеет смысла

alex01011
9 августа 2021 в 04:07
1

@klutt Больше похоже на вопрос с подвохом в викторине или что-то подобное. Создан, чтобы запутать.

Ответы (2)

avatar
InQusitive
9 августа 2021 в 03:24
2
int printf(const char *restrict format, ...);

Когда вы выполняете format - 'A' + 'B', оно равно format + 1, учитывая значения ASCII A и B.

format — это базовый адрес, и когда вы делаете format + 1, он указывает на вторую ячейку памяти этой строки символов, и оттуда начинается печать, которая является ndia.

avatar
klutt
9 августа 2021 в 04:15
0

Выражение "india"-'A'+'B' не имеет смысла ни в одном нормальном коде. Но это приведет (но см. ниже) к указателю на второй элемент, потому что 'B' - 'A' будет оцениваться как 1.

Однако подвыражение "india"-'A' вызовет неопределенное поведение, поскольку результирующий указатель будет указывать вне массива. Это объясняется здесь: Почему в C запрещено указывать единицу перед первым элементом массива?

Если мы немного перепишем и добавим круглые скобки: "india"+('B'-'A') выражение корректно определено и равно "india" + 1

Aditya Mishra
9 августа 2021 в 10:37
0

выражение printf("india"-('A'+'B')) указывает на "индия"-131 ASCII из {A(65)+B(66)} и нет вывода этого выражения "india"-('A'+'B') . Но выражение printf("india"+(-'A'+'B')) выводит: ndia

klutt
9 августа 2021 в 22:35
0

@AdityaMishra Не знаю, почему мой комментарий исчез, но спасибо. Я рассмотрел эти вопросы.