Две строки в скобках, разделенные запятой в C++
Возможный дубликат:
C++ оператор запятой
Сегодня я столкнулся с неожиданным (по крайней мере для меня) поведением C++, демонстрируемым следующим фрагментом кода:
#include <iostream>
int main()
{
std::cout << ("1", "2") << std::endl;
return 0;
}
Выход:
2
Это работает с любым количеством строк в скобках. Протестировано на компиляторе Visual Studio 2010, а также на кодовой панели.
Мне интересно, почему это компилируется в первую очередь, какова польза от этой "функции"?
5 ответов
Ааа, это оператор запятой. Когда вы используете запятую и два (или более) выражения, происходит то, что все выражения выполняются, и результат в целом является результатом последнего выражения. Вот почему вы получаете "2" в результате этого. Смотрите здесь для большего объяснения.
Это называется оператор запятой: в выражении x, y
компилятор сначала оценивает x
(включая все побочные эффекты), затем y
; Результаты выражения являются результатами y
,
В выражении, которое вы цитируете, оно абсолютно бесполезно; первая строка просто игнорируется. Однако, если первое выражение имеет побочные эффекты, это может быть полезно. (В основном для запутывания, на мой взгляд, и его лучше избегать.)
Обратите внимание, что это работает только тогда, когда запятая является оператором. Если это может быть что-то еще (например, пунктуация, разделяющая аргументы функции), это так. Так:
f( 1, 2 ); // Call f with two arguments, 1 and 2
f( (1, 2) ); // Call f with one argument, 2
(Видите. Я говорил вам, что это хорошо для запутывания.)
Оператор запятой (,) Оператор запятой (,) используется для разделения двух или более выражений, которые включены, когда ожидается только одно выражение. Когда набор выражений должен быть оценен для значения, учитывается только самое правое выражение.
Например, следующий код:
a = (b=3, b+2);
Ссылка: HTTP://www.cplusplus.com/doc/tutorial/operators/
Результатом запятой (",") является правильное подвыражение. Я использую его в циклах над контейнерами stl:
for( list<int>::iterator = mylist.begin(), it_end = mylist.end(); it != it_end; ++it )
...
Оператор запятой вычисляет выражения с обеих сторон запятой, но возвращает результат второго.