Верны ли эти примеры? - PullRequest
0 голосов
/ 18 июня 2020

В этом видео на YouTube я наткнулся на следующие примеры:

enter image description here

Однако они не кажутся исправьте для меня, для первого примера:

*ptr++

В моем понимании это означает, что, если ++ имеет больший приоритет, чем *, увеличивайте указатель на 1 в арифметике указателя c, затем получите значение, хранящееся в адресе, на который указывает этот новый указатель. Таким образом, код

x = *ptr++;

должен быть равен,

ptr++;
x = *ptr;

, что либо противоречит видео, либо я что-то смешиваю. Подскажите, пожалуйста, прав я или нет?

Ответы [ 2 ]

3 голосов
/ 18 июня 2020

Приоритет влияет на структуру выражений. Это не влияет на правила операций.

В *ptr++ приоритет говорит, что правила для ++ применяются к ptr, а затем правила для * применяются к результат.

Правила для ++ говорят, что с ptr++ результирующее значение равно ptr при запуске операции и, отдельно, значение ptr увеличивается. Фактическое приращение ptr в памяти может происходить до, во время или после создания значения результата, но оно не влияет на значение: полученное значение всегда равно значению ptr перед приращением, независимо от того, когда приращение действительно происходит.

Правила для * говорят, что результатом является объект, на который указывает его операнд. Итак, с *ptr++ результатом будет объект, на который указывает ptr до применения приращения.

1 голос
/ 18 июня 2020

Каждое выражение, если оно не является недействительным, имеет значение.

Значение приращения постфикса - это значение его операнда до увеличения.

Из стандарта C (6.5.2.4 Постфиксные операторы увеличения и уменьшения)

2 Результатом постфиксного оператора ++ является значение операнда . В качестве побочного эффекта значение объекта операнда увеличивается (то есть к нему добавляется значение 1 соответствующего типа)

То есть это выражение

*ptr++

оценивается как

*( ptr++ )

, а значение выражения в круглых скобках - это значение указателя (операнда постфиксного приращения) до увеличения самого операнда, которое оценивается как побочный эффект.

Это разница между приращением постфикса и приращением префикса, для которого (6.5.3.1 Операторы увеличения и уменьшения префикса)

2 Значение операнда префикса ++ оператор увеличивается. Результат - новое значение операнда после приращения .

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

Вот демонстрационная программа.

#include <stdio.h>

int main(void) 
{
    int a[] = { 1, 2 };
    int *p = &a[0];

    printf( "a[0] = %d, a[1] = %d\n", a[0], a[1] );

    p++[0] = 3;
    *p = 4;

    printf( "a[0] = %d, a[1] = %d\n", a[0], a[1] );

    return 0;
}

Результат программы:

a[0] = 1, a[1] = 2
a[0] = 3, a[1] = 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...