Является ли?: Выражение не всегда оценивается?

В Лиспе любое выражение может быть оценено. 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:

Выражение может привести к значению и может вызвать побочные эффекты.

0

Решение

Значение выражения b ? f1() : f2() либо f1() или же f2() в зависимости от стоимости b, В вашем случае обе функции возвращают voidТаким образом, значение выражения ничего такого.

5

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

Выражение Можно иметь значение. Не все выражения имеют
значение, так же, как не все выражения имеют побочные эффекты.
выражение имеет тип; выражение типа void
не имеет значения (так как набор значений для void является
пусто).

В выражении формы cond ? expr1 : expr2тип
определяется на основе типов expr1 а также expr2, Если
и то и другое expr1 а также expr2 являются voidто тип
условное выражение voidи это не имеет значения.

2

Значение 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.

1

Значение f1(), Однако я не понимаю, что вы хотите сказать об отношении между этим и operator+,

0

Троичный оператор оценивает выражения — в данном случае это означает, что true оценивается в true а потом f1() оценивается, что ничего не делает (выражение оценивается в void).

Я думаю, что это одна из причин, почему мы имеем void на языке.

Пожалуйста, посмотрите это приятно статья для деталей.

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