порядок оценки параметров функции - PullRequest
2 голосов
/ 17 июля 2011

Что будет напечатано в результате операции ниже:

x=5; 
printf("%d,%d,%d\n",x,x<<2,x>>2); 

Ответ: 5,20,1

Я думал, что порядок не определен, но я нашел выше как вопрос интервью намного сайтов.

Ответы [ 5 ]

3 голосов
/ 17 июля 2011

Из стандарта C ++:

Порядок оценки аргументов не указан. Все побочные эффекты при оценке выражений аргументов вступают в силу до входа в функцию. Порядок вычисления выражения постфикса и списка выражений аргументов не указан.

Тем не менее, ваш пример будет иметь неопределенное поведение, только если аргументы были x>>=2 и x<<=2, так что x был изменен.

3 голосов
/ 17 июля 2011

Операторы сдвига битов не изменяют значение переменной ... поэтому порядок не имеет значения.

3 голосов
/ 17 июля 2011

Порядок оценки не указан, но это не имеет значения, потому что вы вообще не изменяете x.

Таким образом, программа четко определена, и ответ такой, какой дан.

Следующее будет иметь неопределенную семантику:

printf("%d,%d,%d\n", x, x <<= 2, x >>= 2); 
1 голос
/ 09 января 2012

Я нашел ответ в c ++ стандартах .

Пункт 5.2.2.8:

Порядок оценки аргументов не определен.Все побочные эффекты при оценке выражений аргументов вступают в силу до входа в функцию.Порядок вычисления выражения postfix и списка выражений аргументов не определен.

Другими словами, это зависит только от компилятора.

0 голосов
/ 17 июля 2011

Порядок оценки не определен в Официальной спецификации С.

Однако с практической точки зрения параметры обычно оцениваются справа налево.

В вашей задаче оператор сдвига бит не меняет значение X, поэтому порядок вычисления не важен. Вы получите 5,20,1, независимо от того, будут ли они оценены слева направо, справа налево или посередине.

В C параметры помещаются в стек в порядке справа налево, так что 1-й параметр (в этом случае, char * "% d,% d,% d ") находится на вершине стека. Параметры обычно (но не всегда) оцениваются в том же порядке, в котором они передаются.

Проблема, которая лучше иллюстрирует то, о чем вы говорите:

int i=1;
printf("%d, %d, %d", i++, i++, i++);

Официальный ответ - "undefined".
Практический ответ (в нескольких компиляторах / платформах, которые я пробовал) - «3, 2, 1».

...