Как сообщалось, программа имеет несколько проблем:
- она пытается изменить строковую константу
"ayqm"
, которая описана как неопределенное поведение в стандарте C. - он использует
printf
без надлежащего объявления, снова вызывая неопределенное поведение. - его вывод не завершается символом новой строки, вызывая поведение, определяемое реализацией.
- прототип для
main
без возвращаемого типа является устаревшим, больше не поддерживается стандартом C. - инкрементные символы создают поведение, определяемое реализацией.Если набор символов выполнения ASCII,
'a'+1
производит 'b'
, но это не гарантируется стандартом C.Действительно, в наборе символов EBCDIC, все еще используемом в старых компьютерах мэйнфреймов, буквы находятся в одной монотонной последовательности (например: 'a'+1 == 'b'
, но 'i'+1 != 'j'
в этом наборе символов).
Вот исправленная версия:
#include <stdio.h>
int main(void) {
char str[] = "ayqm";
char *p = str;
printf("%c\n", ++*(p++));
return 0;
}
p
является постинкрементным, что означает, что текущее значение p
используется для оператора *
, а значение p
увеличивается до следующей точки последовательности, а именновызов функции printf
.Символ, считываемый через p
, 'a'
, затем увеличивается, что может давать или не давать 'b'
в зависимости от набора символов выполнения.
После того, как printf
вернется к функции main
, p
указывает на str[1]
, а str
содержит строку "byqm"
.