2013-08-29 1 views
0

Я сделал некоторый код, который выглядит следующим образом:Что делает «foo = bar1, bar2»?

int foo, bar1 = 4, bar2 = 7; 

foo = bar1, bar2; // Look at this expression. 

printf("%d", foo); 

Составитель его с GCC, с -Wall и -Wextra. Выходной сигнал был 4.

Помимо уродства, это выражение неопределенное поведение, или foo всегда установлено на bar1?

+0

Следует вывод 4. Http: //en.wikipedia. org/wiki/Comma_operator "В языках программирования C и C++ оператор запятой (представленный токеном) является двоичным оператором, который оценивает свой первый операнд и отбрасывает результат, а затем оценивает второй операнд и возвращает это значение (и тип) ». но назначение - более высокий приоритет, поэтому он сначала назначает сбросы. –

+3

@PaulTomblin Правда, но я думаю, что ',' имеет более низкий приоритет, чем '='. –

+0

@PaulTomblin Он также находится в нижней части диаграммы приоритета (последний раз я проверил), поэтому в вопросе OP оператор присваивания сначала имеет приоритет, а оценка «bar2» практически бесполезна. – WhozCraig

ответ

1

Это comma operator, в основном, полезно с боковым осуществлением выражений, как foo = (bar1++, f(bar2)); которая увеличивает bar1, функция f колла с bar2 и установить ее результат foo

В C оператор запятой имеет более низкий приоритет, чем присвоение ,

В целом e1,e2 (в контексте выражения) оценивает левый операнд e1, отбрасывает его результат, затем оценить правый операнд e2 и дает значение правого операнда (в качестве значения всего e1,e2 выражения).

Ocaml имеет оператор ;, схема имеет begin, Лисп имеет progn для аналогичных целей (оценка два или несколько субов-выражений для побочных эффектов, и давая последний, как весь результат).

1

В этом выражении используется оператор ,, который оценивает его операнды слева направо и возвращает последнее. Поэтому он оценивает foo = bar1, а затем bar2.

0

здесь

foo = bar1; 

для более глубокого понимания,

int foo = barx, * barp; 

Здесь , оператор означает

int foo = barx; 
int *barp;