Да, там есть проблема с --p*
, это не допустимый C, следовательно, программа ничего не печатает. Вам также не хватает точки с запятой в конце строки char s[] ...
.
Возможно, вы имели в виду что-то вроде этого:
#include <stdio.h>
int main (void) {
char s[] = "abcdef", *p;
for (p = &s[5]; p >= s; p--) --*p;
puts(s);
return 0;
}
который печатает:
`abcde
(конечно, если вы работаете в среде ASCII).
И, любая книга, которая объявляет main
как:
main()
вместо одной из двух канонических форм, следует выбросить.
Еще одна вещь, на которую следует обратить внимание, стандарт не требует, чтобы арифметика указателей работала, если оба указателя не указывают внутри объекта или один указатель находится за концом. Таким образом, сравнение окончательного значения p
(то есть &(s[-1])
) с s
не гарантируется. Лучшее решение:
#include <stdio.h>
int main (void) {
char s[] = "abcdef", *p;
for (p = s; *p != 0; p++) --*p;
puts(s);
return 0;
}
Соответствующий раздел C99: 6.5.6/8
:
Когда выражение с целочисленным типом добавляется или вычитается из указателя, результат имеет тип операнда указателя.
...
Если и операнд-указатель, и результат указывают на элементы одного и того же объекта массива или один после последнего элемента объекта массива, при оценке не должно быть переполнения; в противном случае поведение не определено. Если результат указывает на один последний элемент массива, он не должен использоваться как операнд унарного * оцениваемого оператора.