2011-12-23 2 views
9
int a = 1; 
int b = (1,2,3); 
cout << a+b << endl; // this prints 4 
  1. Является ли (1,2,3) какой-то структуры в C++ (некоторые примитивного типа списка, может быть?)
  2. Почему b присваивается значение 3? Компилятор просто берет последнее значение из списка?
+1

В этом коде нет логики. Это то, что учитель мог бы сделать, чтобы проверить ваше понимание оператора запятой. При необходимости используйте [домашнее задание]. –

+0

или ошибка в опечатке. Т.е. (1,2,3) это не то, что автор кода предполагал. – ddyer

+0

Возможный дубликат [Что делает оператор запятой \ ', \' делать в C?] (Http: // stackoverflow.com/questions/52550/what-do-the-comma-operator-do-in-c) –

ответ

8

Да, это именно так: компилятор принимает последнее значение. Это оператор запятой, и он оценивает свои операнды слева направо и возвращает самый правый. Он также разрешает право налево. Почему кто-то написал такой код, я понятия не имею :)

So int b = (1, 2, 3) равнозначно int b = 3. Это не примитивный список любого типа, и оператор запятой , в основном используется для оценки нескольких команд в контексте одного выражения, например a += 5, b += 4, c += 3, d += 2, e += 1, f.

+4

Одно хорошее использование (вид) находится внутри for (;; ++ x, ++ y) –

+0

@LokiAstari: Ага. (Я просто понял - «Почему кто-то писал бы такой код, я понятия не имею». Я имел в виду «(1, 2, 3)», что бесполезно. Оператор запятой в порядке: ') – Ryan

+0

Единственная возможная (не обязательно хорошая) причина, о которой я могу думать, будет навязывать кучу операций вместе, где вам все равно, о результатах каждого. [Пример] (http://ideone.com/MuwxQ). * edit: * и Loki будет другим. – FakeRainBrigand

6

(1,2,3) - выражение, использующее два экземпляра оператора запятой. Оператор запятой оценивает свой левый операнд, тогда есть точка последовательности, а затем вычисляется его правый операнд. Значение оператора запятой является результатом оценки правого операнда, результат оценки левого операнда отбрасывается.

int b = (1,2,3); 

, таким образом, что эквивалентно:

int b = 3; 

Большинство составителей будет предупреждать о таком использовании запятой операнда, поскольку есть только когда-либо в точку, используя оператор запятой, если выражение левая рука имеет некоторый побочный эффект.

1

Это запятой, который принимает форму expr, expr. Первое выражение оценивается и результат отбрасывается, второе выражение оценивается и возвращается его результат.

В вашем случае эта строка оценивается как:

((1, 2), 3) => 
(2, 3) => 
3 
4

Вторая строка использует оператор запятой. Выражение как

a, b 

оценивает как a и b и возвращает b.

В этом случае вторая строка обрабатывается, как:

int b = ((1, 2), 3); 

так (1, 2) оценивается (в 2), а затем выбрасывали, а конечный результат просто 3.

-3

он, вероятно, используется для be b = foo (1,2,3), но foo случайно удалили. C не жалуется на этот вид дерьма «это особенность».

+0

Я думаю, что те из вас, кто выдает этот ответ, не имеют важного момента. Никто не напишет этот код. Если вопроситель пытается понять этот код, он должен понять, что это не то, что на самом деле намеревался сделать автор. – ddyer

Смежные вопросы