что печатает следующая программа? - PullRequest
1 голос
/ 17 марта 2011
main()
{
char s[] = "abcdef", *p;
for (p = &s[5]; p >= s; p--) --p*;
puts(s);
return 0;
}

Компилятор говорит, что есть проблема с --p * (ожидалось выражение) ?????

Ответы [ 4 ]

4 голосов
/ 17 марта 2011

--p* не имеет никакого смысла.

Возможно, вы имели в виду --*p или --p?Ваш код печатает `abcde, когда базовым представлением является ASCII.Кстати, C99 обязывает тип возвращаемого значения main() быть int в размещенной среде.

3 голосов
/ 17 марта 2011
  • Вам не хватает ; в строке 3 и

  • Вы, вероятно, хотите

    --p
    

    вместо

    --p*
    

Затем программа печатает abcdef.

Вот демо ideone .

3 голосов
/ 17 марта 2011

Да, там есть проблема с --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:

Когда выражение с целочисленным типом добавляется или вычитается из указателя, результат имеет тип операнда указателя.

...

Если и операнд-указатель, и результат указывают на элементы одного и того же объекта массива или один после последнего элемента объекта массива, при оценке не должно быть переполнения; в противном случае поведение не определено. Если результат указывает на один последний элемент массива, он не должен использоваться как операнд унарного * оцениваемого оператора.

1 голос
/ 17 марта 2011

пропущена точка с запятой ... Я вижу это ясно!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...