вернуть список значений в скобках (10, 20, 30, 40)?

Я работаю в C ++ (не C ++ / CLI) в Visual Studio 2012.

Я не понимаю, почему этот код работает, я ожидал, что он потерпит неудачу во время компиляции, но он даже не потерпит неудачу во время выполнения:

double MyClass::MyMethod() const
{
//some code here
return (10, 20, 30, 40);
}

Я создал этот код по ошибке, не специально, я заметил ошибку, когда проводил свои модульные тесты. И я удивлен, что это работает. Когда я запускаю его, он возвращается 40, последний номер в списке.

Может кто-нибудь объяснить мне, что означает этот синтаксис и почему он работает?

4

Решение

Это использует оператор запятой который оценит каждое выражение из слева направо но только вернуть последний. Если мы посмотрим на проект стандарта 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);
^

а затем еще два из них.

9

Другие решения

Оператор запятой — это «точка последовательности» в C ++, часто используемая для инициализации нескольких переменных в for петли.

Таким образом, код оценивает ряд целых чисел, по одному за раз, как отдельные выражения. Последнее из них является возвращаемым значением, а оператор return в целом эквивалентен просто return (40);

4

выражение (10, 20, 30, 40) на самом деле серия из 4 выражений, разделенных , Ты можешь использовать , отделить несколько выражений, и результатом является оценка последнего.

1

Вы использовали , то есть оператор запятой

return () является действительным.

и так return (/*valid evaluation*/)

Оператор запятой возвращает последнее значение, т.е. 40

1
По вопросам рекламы [email protected]