int main() {
int y;
int x{ y = 5 };
//x is 5
}
Как это возможно, поскольку y = 5 не является вычисляемым выражением?
Кроме того, почему компилятор или IDE не жалуются на то, что main () не возвращает int?
c++
initialization
declaration
assignment-operator
counterstriker0
источник
источник
y = 5
это выражение, и оно имеет значение5
. Почему вы думаете, что нет?return
вmain
см этот вопрос .y = 5
здесь получается 5. Возможность операторов присваивания возвращать что-то действительно странная особенность C / C ++.Ответы:
Я начну с вашего последнего вопроса
Согласно стандарту C ++ (основная функция 6.6.1)
И относительно этого вопроса
Из стандарта C ++ (8.18 Операторы присваивания и составного присваивания)
Sp это объявление
может быть эквивалентно разделен на два утверждения
Более того, в C ++ вы можете даже сделать ссылку на переменную y следующим образом
Вот демонстрационная программа
Его вывод
Вы можете эту декларацию
переписать тоже как
Однако примите во внимание, что между этими двумя объявлениями (похожими на вышеприведенные объявления) есть разница.
а также
В первом объявлении переменная
x
имеет типint
. Во втором объявлении переменнаяx
имеет типstd::initializer_list<int>
.Чтобы сделать разницу более заметной, посмотрите, как выводятся значения объектов.
Выход программы
источник
Это присваивание, и присваивания дают значения, то есть «cv-неквалифицированный тип левого операнда», см. [Expr.ass / 3] . Следовательно
y = 5
приводитy
, который5
, который используется для инициализацииx
.Относительно вашего второго вопроса смотрите cppreference на main (или [basic.start.main / 5] ):
Следовательно, компилятор или IDE, предупреждающие вас о пропущенном
return
операторе в концеmain
, будут просто ошибочными. По общему признанию, тот факт, что вы всегда должныreturn
объекты из не-void
функции execpt,main
является своего рода ... ну, по историческим причинам, я думаю.источник
return
. -педантикаВ
operator=()
приводит к значению, которое является значение , присвоенное переменной. Из-за этого возможно связать назначения так:источник
Если вы посмотрите на документацию по cppreference , то увидите, что она
operator=()
возвращает ссылку на назначенный объект. Следовательно, назначение может использоваться как выражение, которое возвращает объект, который был назначен.Тогда это просто нормальное задание с фигурными скобками.
источник