首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C++ switch语句表达式求值保证

C++ switch语句表达式求值保证
EN

Stack Overflow用户
提问于 2015-07-03 19:52:21
回答 7查看 3.5K关注 0票数 59

关于开关的标准规定如下。执行switch语句时,将评估其条件,并将其与每个case常量进行比较。

这是否意味着条件表达式只计算一次,并且每个编译器的标准都保证了它?

例如,当在switch语句头中使用函数时,会产生副作用。

int f() { ... }
switch (f())
{
    case ...;
    case ...;
}
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2015-07-03 20:13:31

我认为可以保证f只被调用一次。

首先,我们有

条件应为整型、枚举型或类型。

6.4.2 (1)

作为表达式的条件的值就是表达式的值

6.4 (4)。此外,

条件的值将简称为“

condition”,其中用法是明确的。

6.4 (4)这意味着在我们的例子中,"condition“只是一个int类型的普通值,而不是ff仅用于查找条件的值。现在,当控制到达switch语句时

对其条件进行评估

6.4.2 (5),即使用f返回的int值作为我们的“条件”。最后,条件(不是f,而是int类型的值)是

与每个case常量比较的

6.4.2 (5)。这将不会再次触发f的副作用。

所有引用自N3797。(还检查了N4140,没有区别)

票数 38
EN

Stack Overflow用户

发布于 2015-07-03 20:56:57

正在读取N4296

第10页第14段:

在计算与下一个完整表达式相关的每个值计算和副作用之前,会对与完整表达式相关的每个值计算和副作用进行排序。

当我读到第10段的第一行时(上面):

完整表达式是指不是另一个表达式的子表达式的表达式。

我必须相信switch语句的条件是一个完整的表达式,并且每个条件表达式都是一个完整的表达式(尽管在执行时是微不足道的)。

switch是一个语句,而不是一个表达式(参见6.4.2和其他许多地方)。

因此,在计算case常量之前,必须先计算switch

与以往一样,许多要点归结为对规范的曲折阅读,以得出明显的结论。

如果我对这句话进行同行评议,我会提出以下修改(在粗体中):

执行switch语句时,每次执行switch语句都会对其条件求值一次,并与每个case常量进行比较。

票数 5
EN

Stack Overflow用户

发布于 2015-07-03 20:20:37

是的,在执行switch语句时,该表达式只计算一次:

§6.4选择语句

4...作为表达式的条件的值是表达式的值……条件的值将被简称为“条件”,其中用法是明确的。

这意味着将对表达式求值,并将其值视为要针对每个case语句求值的condition

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31206205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档