0

在 Lisp 中,可以计算任何表达式。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:

表达式可能会产生一个值并可能导致副作用。

4

5 回答 5

5

表达式的值b ? f1() : f2()f1()f2()取决于 的值b。在您的情况下,两个函数都 return void,所以表达式的值是nothing

于 2013-09-16T07:15:24.200 回答
2

表达式可以有一个值。并非所有表达式都有值,就像并非所有表达式都有副作用一样。表达式确实有类型;类型的表达式void 没有值(因为值集为void空)。

在 form 的表达式中cond ? expr1 : expr2,类型是根据 和 的类型来确定expr1expr2。如果两者expr1都是expr2void则条件表达式的类型是void,并且它没有值。

于 2013-09-16T09:29:09.683 回答
1

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、 的操作数或返回类型为 的函数的 return 语句 (6.6.3) void

将 Lisp 的概念与 C++ 进行比较没有多大意义。您最多可以将 C++ 的概念与其他 C 家族语言(例如 C、Objective C、Java 等)进行比较。Lisp 就像 C 家族语言中“语言池”的另一端。

于 2013-09-16T08:03:27.383 回答
0

值为f1()。但是,关于 this 和 之间的关系,我不明白您想说什么operator+

于 2013-09-16T07:15:24.993 回答
0

三元运算符评估表达式 - 在这种情况下,它意味着true先评估为true然后再f1()评估,它什么也不做(表达式被评估为void)。

void我认为这是我们在语言中拥有的原因之一。

有关详细信息,请参阅这篇不错的文章

于 2013-09-16T07:17:23.280 回答