Я работаю в C ++ (не C ++ / CLI) в Visual Studio 2012.
Я не понимаю, почему этот код работает, я ожидал, что он потерпит неудачу во время компиляции, но он даже не потерпит неудачу во время выполнения:
double MyClass::MyMethod() const
{
//some code here
return (10, 20, 30, 40);
}
Я создал этот код по ошибке, не специально, я заметил ошибку, когда проводил свои модульные тесты. И я удивлен, что это работает. Когда я запускаю его, он возвращается 40, последний номер в списке.
Может кто-нибудь объяснить мне, что означает этот синтаксис и почему он работает?
Это использует оператор запятой который оценит каждое выражение из слева направо но только вернуть последний. Если мы посмотрим на проект стандарта C ++ раздел 5.18
Оператор запятой это говорит:
Пара выражений, разделенных запятой, оценивается слева направо; левое выражение является выражением отброшенного значения (раздел 5).83 Каждое вычисление значения и побочный эффект, связанный с левым выражением, упорядочивается перед каждым вычислением значения и побочным эффектом, связанным с правым выражением.
связанная статья дает наиболее распространенное использование как:
разрешить множественные операторы присваивания без использования блочного оператора, главным образом в инициализации и выражениях приращения цикла for.
и эта предыдущая тема Использование оператора C запятой есть некоторые действительно интересно примеры того, как люди используют оператор запятой если вам действительно любопытно
Включение предупреждения, которое всегда является хорошей идеей, могло бы помочь вам здесь, в gcc
с помощью -Wall
Я вижу следующее предупреждение:
warning: left operand of comma operator has no effect [-Wunused-value]
return (10, 20, 30, 40);
^
а затем еще два из них.
Оператор запятой — это «точка последовательности» в C ++, часто используемая для инициализации нескольких переменных в for
петли.
Таким образом, код оценивает ряд целых чисел, по одному за раз, как отдельные выражения. Последнее из них является возвращаемым значением, а оператор return в целом эквивалентен просто return (40);
выражение (10, 20, 30, 40)
на самом деле серия из 4 выражений, разделенных ,
Ты можешь использовать ,
отделить несколько выражений, и результатом является оценка последнего.
Вы использовали ,
то есть оператор запятой
return ()
является действительным.
и так return (/*valid evaluation*/)
Оператор запятой возвращает последнее значение, т.е. 40