В Лиспе любое выражение может быть оценено. C ++ принимает понятия: «Выражение», «Значение», «Оценка».
Пожалуйста, обратитесь к стандарту C ++ 5.1, если вы не знаете отношений между «Выражением», «Значением» и «Оценкой».
Я знаю?: Выражение такое же, как + выражение.
Любое выражение должно быть в состоянии быть оценено и дать значение. тем не мение ?:
выражение кажется не всегда таким.
void f1() {}
void f2() {}
void test(bool b)
{
b ? f1() : f2(); // OK. What's the value of this expression?
}
Любое выражение должно иметь значение; b ? f1() : f2();
это выражение; Какова его ценность?
Любое объяснение?
Обновления и мой собственный ответ:
Выдержка из стандарта C ++ 5.1:
Выражение может привести к значению и может вызвать побочные эффекты.
Значение выражения b ? f1() : f2()
либо f1()
или же f2()
в зависимости от стоимости b
, В вашем случае обе функции возвращают void
Таким образом, значение выражения ничего такого.
Выражение Можно иметь значение. Не все выражения имеют
значение, так же, как не все выражения имеют побочные эффекты.
выражение имеет тип; выражение типа void
не имеет значения (так как набор значений для void
является
пусто).
В выражении формы cond ? expr1 : expr2
тип
определяется на основе типов expr1
а также expr2
, Если
и то и другое expr1
а также expr2
являются void
то тип
условное выражение void
и это не имеет значения.
Значение true ? f1() : f2()
является void
, Исходя из вашей отредактированной части, ваш главный вопрос заключается в том, можно ли рассматривать тип void как выражение, ответ — ДА.
C ++ 11 §3.9.1 Основные типы Раздел 9
void
Тип имеет пустой набор значений.void
тип является неполным типом, который не может быть завершен. Он используется в качестве типа возврата для функций, которые не возвращают значение. Любое выражение может быть явно преобразовано в типcv void
(5.4). Выражение типа void должно использоваться только как выражение выражения (6.2), как операнд выражения запятой
(5,18), в качестве второго или третьего операнда?:
(5.16), как операндtypeid
или как выражение в операторе возврата (6.6.3) для функции с типом возвратаvoid
,
Нет смысла сравнивать концепции Lisp с C ++. В лучшем случае вы можете сравнить концепции C ++ с другими языками семейства C, такими как C, Objective C, Java и т. Д. Lisp похож на другой конец «языкового пула» из языков семейства C.
Значение f1()
, Однако я не понимаю, что вы хотите сказать об отношении между этим и operator+
,
Троичный оператор оценивает выражения — в данном случае это означает, что true
оценивается в true
а потом f1()
оценивается, что ничего не делает (выражение оценивается в void
).
Я думаю, что это одна из причин, почему мы имеем void
на языке.
Пожалуйста, посмотрите это приятно статья для деталей.