Предположим, что включены все заголовочные файлы.
void main() {
int i;
clrscr();
printf("india"-'A'+'B');
getch(); }
Вывод следующей функции: ndia
Кто-нибудь может объяснить мне этот вывод?
Предположим, что включены все заголовочные файлы.
void main() {
int i;
clrscr();
printf("india"-'A'+'B');
getch(); }
Вывод следующей функции: ndia
Кто-нибудь может объяснить мне этот вывод?
int printf(const char *restrict format, ...);
Когда вы выполняете format - 'A' + 'B'
, оно равно format + 1
, учитывая значения ASCII A
и B
.
format
— это базовый адрес, и когда вы делаете format + 1
, он указывает на вторую ячейку памяти этой строки символов, и оттуда начинается печать, которая является ndia
.
Выражение "india"-'A'+'B'
не имеет смысла ни в одном нормальном коде. Но это приведет (но см. ниже) к указателю на второй элемент, потому что 'B' - 'A'
будет оцениваться как 1
.
Однако подвыражение "india"-'A'
вызовет неопределенное поведение, поскольку результирующий указатель будет указывать вне массива. Это объясняется здесь: Почему в C запрещено указывать единицу перед первым элементом массива?
Если мы немного перепишем и добавим круглые скобки: "india"+('B'-'A')
выражение корректно определено и равно "india" + 1
выражение printf("india"-('A'+'B'))
указывает на "индия"-131 ASCII из {A(65)+B(66)} и нет вывода этого выражения "india"-('A'+'B')
. Но выражение printf("india"+(-'A'+'B'))
выводит: ndia
@AdityaMishra Не знаю, почему мой комментарий исчез, но спасибо. Я рассмотрел эти вопросы.
Арифметика указателя. Почему бы вам не объяснить, что вы ожидаете?
Выражение
"india"-'A'+'B'
вообще не имеет смысла@klutt Больше похоже на вопрос с подвохом в викторине или что-то подобное. Создан, чтобы запутать.