В чем разница между * d ++ и (* d) ++ в C? - PullRequest
8 голосов
/ 10 октября 2009

как в названии, в чем разница, потому что эти два, кажется, дают мне одинаковые результаты?

Ответы [ 6 ]

13 голосов
/ 10 октября 2009

Нет, они не одинаковы. Предположим, что d является указателем на int:

int n = 0;
int* d = &n;

*d++; // d++ then *d, but d++ is applied after the statement.
(*d)++; // == n++, just add one to the place where d points to.

Я думаю, что в K & R есть пример, где нам нужно скопировать c-строку в другую:

char* first = "hello world!";
char* second = malloc(strlen(first)+1);
....

while(*second++ = *first++)
{
 // nothing goes here :)
}

Код прост: поместите символ, обозначенный first, в символ, обозначенный second, затем увеличьте оба указателя после выражения. Конечно, когда копируется последний символ '\ 0', выражение приводит к false и останавливается!

9 голосов
/ 10 октября 2009

Приращение ++ имеет более высокий приоритет оператора, чем разыменование *, поэтому *d++ увеличивает указатель d для указания следующего местоположения в массиве, но результатом ++ является исходный указатель d, поэтому *d возвращает исходный элемент, на который указывает. И наоборот, (*d)++ просто увеличивает значение, на которое указывает.

Пример:

// Case 1
int array[2] = {1, 2};
int *d = &array[0];
int x = *d++;
assert(x == 1 && d == &array[1]);  // x gets the first element, d points to the second

// Case 2
int array[2] = {1, 2};
int *d = &array[0];
int x = (*d)++;
assert(x == 1 && d == &array[0] && array[0] == 2);
// array[0] gets incremented, d still points there, but x receives old value
1 голос
/ 10 октября 2009

В официальной терминологии C эти выражения дают вам те же результаты , что и должны. В правильной терминологии «результатом» не пустого выражения является то, к чему это выражение относится. Оба ваших выражения оценивают начальное значение *d, поэтому неудивительно, что результаты одинаковы.

Однако, к «результату» каждое выражение в C имеет ноль или более так называемых «побочных эффектов». И побочные эффекты этих двух выражений совершенно разные. Первое выражение увеличивает значение указателя 'd'. Второе выражение увеличивает значение '* d' (указанное значение).

0 голосов
/ 10 октября 2009

У меня нет под рукой компилятора.

a = (*d)++;
b = (*d);

это == b? я не думаю, что это так.

0 голосов
/ 10 октября 2009

Они возвращают один и тот же результат, но изменение состояния в вашей программе совершенно другое.

Это легче всего понять, если мы просто расширим операции.

x = *d++;
// same as
x = *d;
d += 1; // remember that pointers increment by the size of the thing they point to

x = (*d)++;
// same as
x = *d;
*d += 1; // unless *d is also a pointer, this will likely really just add 1
0 голосов
/ 10 октября 2009

Первый увеличивает указатель, второй увеличивает значение, на которое указывает.

В качестве эксперимента попробуйте это:

int main() {
    int x = 20;
    int *d = &x;
    printf("d = %p\n", d);
    int z = (*d)++;
    printf("z = %d\n", z);
    printf("d = %p\n", d);
    int y = *d++;
    printf("y = %d\n", y);
    printf("d = %p\n", d);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...