[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