Позаботьтесь о приоритете * и ++ в C/C ++ (и любом клавишке при программировании) [Закрыто
-
29-09-2019 - |
Вопрос
Кто -то напишет эту функцию
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++
, поскольку вы не используете значение оператора.
Любой, кто смешивает ++, -, += и т. Д. С другими операторами, уже не удалось написать читаемый код, тот факт, что они избавится от него, является не чем иным, как их должным образом.