在C ++中,没有赋值语句或函数调用语句。
作业是一种表达;函数调用是一个表达式;这是直接来自Bjarne Stroustrup的书“
我知道一个表达式计算一个值,让我想知道这是否适用于void函数,因为它们不返回值。
我想知道返回类型 void 的函数是否仍然算作表达式,如果是,为什么?
答案 0 :(得分:1)
是函数返回没有值(声明为返回void
)在调用它们时仍然计为表达式。这限制了它们在其他表达式中的使用,例如,这样的调用不能在赋值的任何一方。
至于"为什么"?好吧,函数调用是函数调用,是函数调用。为不返回值的函数添加特殊规则会使语言设计变得更加复杂。 C ++已经有足够的特殊规则和例外。
答案 1 :(得分:1)
§5表达式:
1表达式是指定的运算符和操作数序列 计算。表达式可以会产生一个值,可以会产生一个值 效果
因此,表达式的“主要”目的/范围是指定计算,而不是计算值。某些计算可能会产生一个值,而某些计算可能会产生副作用。
除此之外(或实际上首先),“表达式”和“语句”用于定义C和C ++的语法。在语法上不可能使函数不返回值而不是“表达式”。在语义层面添加这种区别将是不必要的过度复杂化。
答案 2 :(得分:0)
是的,void
函数调用也是一个表达式。 C ++标准中的定义说:
表达式是一系列指定a的运算符和操作数 计算。表达式可以导致值,可以导致侧 的效果。
函数调用后缀表达式,后跟括号 包含一个可能为空的逗号分隔的表达式列表 构成函数的参数。
同样在 MSDN C ++语言参考:
后缀表达式,后跟函数调用运算符(), 指定函数调用。
答案 3 :(得分:0)
Function Call = expression-statement ...甚至类型为void的函数?
没有。但那是因为函数调用是这样的:
do_stuff()
那是expression_opt
。它是一种表达,而不是一种陈述。您可以在复合表达式中使用此表达式,但它不是语言逻辑的语句。
您可以通过为其添加分号来快速将expression_opt
转换为expression-statement
:
do_stuff();
现在是一份完整的声明。
如果你想到像
这样的东西,差异就会变得清晰if(good_thing() || do_stuff())
{
....
}
do_stuff()
和good_thing()
是表达式,可以/将被评估。 ()
之后的分号会破坏if
子句。