【发布时间】:2015-09-21 06:14:13
【问题描述】:
关于开关,标准规定如下。 “当 switch 语句被执行时,它的条件被评估并与每个 case 常量进行比较。”
是否意味着条件表达式只计算一次,并且每个编译器都有标准保证?
例如,当一个函数用在switch语句头部时,会有副作用。
int f() { ... }
switch (f())
{
case ...;
case ...;
}
【问题讨论】:
-
这就像询问
int main() { putchar('c'); }是否保证只调用一次putchar(因此保证只打印一个'c')。真的,我不知道标准中有任何提供这种保证的文本。 -
我不同意。 switch 是一个特殊的语句,它可以在汇编中以几种有效的方式实现。对我来说,这并不明显。
-
我认为 cpplearner 是对的,“as-if”规则允许“几种有效的组装方式”。除此之外,保证您的函数调用(具有副作用)被评估一次,在 C++ 中的每个上下文中,都是相同的,无论是哪种上下文。
-
@mikk:你能想出一个优化器会多次评估表达式的好理由吗?
-
@YvesDaoust:当然不是 :) 但问题是它是否得到保证。
标签: c++ standards language-lawyer