关于开关的标准规定如下。执行switch语句时,将评估其条件,并将其与每个case常量进行比较。
这是否意味着条件表达式只计算一次,并且每个编译器的标准都保证了它?
例如,当在switch语句头中使用函数时,会产生副作用。
int f() { ... }
switch (f())
{
case ...;
case ...;
}
发布于 2015-07-03 20:13:31
我认为可以保证f
只被调用一次。
首先,我们有
条件应为整型、枚举型或类型。
作为表达式的条件的值就是表达式的值
6.4 (4)。此外,
条件的值将简称为“
condition”,其中用法是明确的。
6.4 (4)这意味着在我们的例子中,"condition“只是一个int
类型的普通值,而不是f
。f
仅用于查找条件的值。现在,当控制到达switch
语句时
对其条件进行评估
6.4.2 (5),即使用f
返回的int
值作为我们的“条件”。最后,条件(不是f
,而是int
类型的值)是
与每个case常量比较的
6.4.2 (5)。这将不会再次触发f
的副作用。
所有引用自N3797。(还检查了N4140,没有区别)
发布于 2015-07-03 20:56:57
正在读取N4296
第10页第14段:
在计算与下一个完整表达式相关的每个值计算和副作用之前,会对与完整表达式相关的每个值计算和副作用进行排序。
当我读到第10段的第一行时(上面):
完整表达式是指不是另一个表达式的子表达式的表达式。
我必须相信switch
语句的条件是一个完整的表达式,并且每个条件表达式都是一个完整的表达式(尽管在执行时是微不足道的)。
switch
是一个语句,而不是一个表达式(参见6.4.2和其他许多地方)。
因此,在计算case
常量之前,必须先计算switch
。
与以往一样,许多要点归结为对规范的曲折阅读,以得出明显的结论。
如果我对这句话进行同行评议,我会提出以下修改(在粗体中):
执行switch语句时,每次执行switch语句都会对其条件求值一次,并与每个case常量进行比较。
发布于 2015-07-03 20:20:37
是的,在执行switch语句时,该表达式只计算一次:
§6.4选择语句
4...作为表达式的条件的值是表达式的值……条件的值将被简称为“条件”,其中用法是明确的。
这意味着将对表达式求值,并将其值视为要针对每个case
语句求值的condition
。
https://stackoverflow.com/questions/31206205
复制相似问题