[devel] вопрос по языку Си - порядок вычисления операндов
Damir Shayhutdinov
damir at altlinux.org
Thu Oct 1 05:00:32 UTC 2009
> Теперь посмотрим на вычитание указателей в строках 729-730. Левый
> операнд вычитания может изменить ts->addedPackages.list, а правым
> операндом является сам ts->addedPackages.list. Получается, что этот
> код зависит от порядка вычисления операндов -- а именно, может
> использоваться либо старое значение ts->addedPackages.list, либо
> уже новое значение.
>
> Воопрос соответствено насколько легален этот код, и вообще любая
> нетривиальная информация на эту тему.
Сделал тест:
#include <stdio.h>
static int change(int* p)
{
*p = *p + 1;
return *p;
}
void main(void)
{
int a = 100;
int b = change(&a) - a;
printf("a=%d, b=%d\n", a, b);
}
После компиляции и запуска получается что b = 0; Что с -O0, что с -O2,
что с -O3.
Под рукой нет стандарта С, чтобы уточнить, но по крайней мере для gcc
этот код, похоже, легален.
More information about the Devel
mailing list