在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:
表达式可能会导致值,并可能导致副作用。
答案 0 :(得分:5)
表达式b ? f1() : f2()
的值为f1()
或f2()
,具体取决于b
的值。在您的情况下,两个函数都返回void
,因此表达式的值是 nothing 。
答案 1 :(得分:2)
表达式可以具有值。并非所有表达都有
一个值,就像并非所有表达都有副作用一样。一个
表达式确实有类型; void
类型的表达式
没有值(因为void
的值集是
空)。
在cond ? expr1 : expr2
形式的表达式中,类型
根据{{1}}和expr1
的类型确定。如果
expr2
和expr1
都是expr2
,然后是void
的类型
条件表达式是void
,它没有值。
答案 2 :(得分: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
的操作数,或作为返回语句中的表达式(6.6.3)对于返回类型为void
的函数。
将Lisp的概念与C ++进行比较没有多大意义。您最多可以将C ++的概念与其他C族语言(如C,Objective C,Java等)进行比较.Lisp就像C系列语言中“语言池”的另一端。
答案 3 :(得分:0)
值为f1()
。但是,我不想得到关于它与operator+
之间关系的内容。
答案 4 :(得分:0)
三元运算符评估表达式 - 在这种情况下,它意味着true
被评估为true
,然后评估f1()
,这不会做任何事情(表达式计算为void
)。
我认为这是我们在语言中void
的原因之一。
有关详细信息,请参阅此article。