Я изучаю C-язык и довольно путаю различия между ++*ptr
и *ptr++
.
Например:
int x = 19;
int *ptr = &x;
Я знаю, что ++*ptr
и *ptr++
создают разные результаты, но я не уверен, почему это?
Я изучаю C-язык и довольно путаю различия между ++*ptr
и *ptr++
.
Например:
int x = 19;
int *ptr = &x;
Я знаю, что ++*ptr
и *ptr++
создают разные результаты, но я не уверен, почему это?
Эти инструкции дают разные результаты из-за того, как связываются операторы. В частности, префикс ++
имеет тот же приоритет, что и *
, и они связывают права налево. Таким образом,
++*ptr
анализируется как
++(*ptr)
означает "увеличить значение, на которое указывает ptr
,". С другой стороны, оператор postfix ++
имеет более высокий приоритет, чем оператор dereferrence *
. Thefore
*ptr++
означает
*(ptr++)
что означает "оценить значение, указанное в настоящее время на ptr
, и увеличить значение ptr
" (порядок которого не указан).
В описанном вами контексте вы, вероятно, захотите написать ++*ptr
, который будет косвенно увеличивать x
через ptr
. Написание *ptr++
было бы опасно, потому что он прошел бы ptr
вперед x
, а так как x
не является частью массива, указатель будет болтаться где-то в памяти (возможно, поверх самого себя!)
Надеюсь, это поможет!
Принятый ответ неверен. Это не тот случай, когда оператор postfix ++
имеет тот же приоритет, что и разыменование/коснутость *
. Операторы префикса и постфикса имеют другой приоритет, и только префиксный оператор имеет тот же приоритет, что и разыменование/косвенность.
Как говорит templatetypedef, но вы должны указать скобки вокруг *ptr
, чтобы обеспечить результат. Например, следующие данные дают 1606415888, используя GCC и 0, используя CLang на моем компьютере:
int x = 19;
int *ptr = &x;
printf("%d\n", *ptr++);
printf("%d\n", *ptr);
И вы ожидали, что x
будет равно 20. Поэтому используйте (*ptr)++
.