Позаботьтесь о приоритете * и ++ в C/C ++ (и любом клавишке при программировании) [Закрыто

StackOverflow https://stackoverflow.com/questions/3110140

Вопрос

Кто -то напишет эту функцию

void strToUpper(char *p) {
  while (*p) {
    *p = TOUPPER(*p);
    *p++;                //<-- Line to pay attention
  }
}

Я спросил, почему вы положили * до P ++?

Ответ: Потому что «это то же самое», я исправил код, а затем некоторое время останусь злым, потому что оба действительно работают одинаково ...

void strToUpper(char *p) {
  while (*p) {
    *p = TOUPPER(*p);
    p++;                //<-- Line to pay attention
  }
}

Поэтому я хотел бы поделиться этим с Stackoverflow, пример:

char s [6] = "Привет";

Что бы он сделал?

*++ptr;

Это оценит предварительный показатель ++ (над указателем), а затем оператор Dereference *, поэтому он позволит QUAL «E» (вторая буква «Привет») (которая не используется в этом случае и может генерировать Предупреждение о компиляции) и указатель будут указывать из «E» (позиция 1)

Что бы он сделал?

*ptr++;

Это немного странно, потому что сначала он оценит оператора Dereference *, поэтому он позволит char naly 'h' (то есть ни в этом случае, а затем и пост-включение ++ (к указателю), так что так (Снова) указатель будет указывать из «E» (позиция 1)

Что бы он сделал?

ptr++;

Наконец, у него не будет никакого LVALUE of char, но он не будет генерировать никаких предупреждений, если не будет использоваться, и указатель также будет указывать на «E» (позиция 1).

Эти три формы делают то же самое с адресной точки зрения указателя ..

ИМХО, это худшая вещь из некоторых компьютерных языков (почти все) ..

«Существует плохое расстояние в химинге между любым кодом и любой ошибкой»

У нас нет избыточности при программировании, если вы принимаете юридическую книгу и пишете случайные чары внутри, оно будет читаемым, но если вы вводите случайное при программировании, вы получаете ошибку, 100% точности

Это было полезно?

Решение

++ имеет приоритет над *. Но я согласен, неясно, когда вы смешиваете оба в одном и том же заявлении.

Другие советы

Согласно приоритету оператора в C, ++ Сначала оценим, и только тогда *. Отказ Так в *p++, ptr получит свою стоимость ptr сейчас указывает. Конечно, это не отличается от ptr++, поскольку вы не используете значение оператора.

Любой, кто смешивает ++, -, += и т. Д. С другими операторами, уже не удалось написать читаемый код, тот факт, что они избавится от него, является не чем иным, как их должным образом.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top