Старшинство и ассоциативность префикса и постфикса в c
int main()
{
char arr[] = "geeksforgeeks";
char *ptr = arr;
while(*ptr != '\0')
++*ptr++;
printf("%s %s", arr, ptr);
getchar();
return 0;
}
Оператор внутри цикла while ++ptr++
ведет себя таким образом, что я не понимаю. Постинкремент должен был быть оценен первым из-за его высокого приоритета, и первое выходное значение должно было быть f (с приращением e). Но этого не происходит. Чтобы понять, я изменил утверждение на ++*(ptr++)
, так что он может дать результат, который я ожидаю (ffltgpshfflt - это результат, который я ожидал; но фактический результат hffltgpshfflt). Но все равно выход не меняется. Оператор () имеет более высокий приоритет, чем преинкремент. Но почему выход не меняется?
1 ответ
У нас есть:
++*ptr++
Во-первых, оператор постфикса применяется, как вы сказали. Однако согласно определению оператора приращения постфикса, ptr++
оценивает ptr
и увеличивается ptr
от 1
, Выражение оценивается не для увеличенного значения, а для исходного значения.
Так *(ptr++)
оценивается в то же значение, что и *ptr
Бывший также увеличивается ptr
, Следовательно, первый элемент в массиве модифицируется при первом проходе алгоритма.
Скобки не имеют значения, потому что приращение постфикса уже имеет приоритет.
Если вы замените это на:
++*++ptr
ты получаешь
gffltgpshfflt
где порядок выполнения операторов одинаков; разница в том, что префикс ++
работает не так как postfix ++
- оценивается в увеличенную стоимость. Обратите внимание, что это также портит нулевой терминатор, так как ptr
модифицируется перед проверкой на равенство 0
,