Сомневаюсь в использовании * ++ p в printf - PullRequest
2 голосов
/ 24 июня 2011
int main(){
    int a[3]={1,10,20};
    int *p=a;
    printf("%d %d " ,*++p,*p);
    return 0;
}

Вывод кода выше на компиляторе gcc равен 10 1.

Я понимаю, что * ++ p увеличивает p и разыменовывает новое значение. Но так как p был увеличен, почему * p возвращает 1 вместо 10?

Ответы [ 4 ]

7 голосов
/ 24 июня 2011

Это неопределенное поведение, в котором оцениваются выражения аргумента функции порядка.Некоторые компиляторы могут использовать слева направо, некоторые справа налево, а некоторые могут выполнять другой порядок оценки в зависимости от ситуации для оптимизации.Так что в вашем случае *p оценивается до *++p, что приводит к вашему "странному выводу".

2 голосов
/ 24 июня 2011

Запятая между *++p и *p означает , а не обозначает точку последовательности , так что это undefined неопределенное поведение.Компилятор может свободно оценивать *p до *++p.

0 голосов
/ 24 июня 2011

Очевидно, ваши аргументы оцениваются в обратном порядке (с последнего на первое), поэтому *p вычисляется первым и возвращает 1.

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

0 голосов
/ 24 июня 2011

Неопределенное поведение, вывод может отличаться на разных компиляторах.

...