不明确的if和else分支:是否定义了行为
Ambiguous if and else branches: Is the behaviour defined?
我最近遇到了一些c++代码,如下所示:
if(test_1)
if(test_2)
{
// Do stuff
}
else
exit(0);
这是有歧义的,因为编译器会把它看作:
if(test_1)
{
if(test_2)
{
}
else
{
}
}
或:
if(test_1)
{
if(test_2)
{
}
}
else
{
}
此代码的行为是根据任何标准(C, c++)定义的吗?我在vc++上的c++程序中看到了这段代码,它似乎更倾向于第一种解决方案。
此代码的行为是根据任何标准(C, c++)定义的吗?
是的,它是有定义的。在C(以及我所知道的所有类似的语言)中,"悬空else"绑定到最后一个自由的if,因此这种解释
if(test_1)
{
if(test_2)
{
}
else
{
}
}
是正确的。
没有歧义。else
子句总是指它所能附着的最近的if
。来自c++标准(6.4选择语句):
在子句6中,术语子语句是指在语法符号中出现的包含语句或语句。选择语句中的子语句(每个子语句都是if语句的else形式)隐式地定义了一个局部作用域(3.3)。
如果选择语句中的子语句是单个语句而不是复合语句,就好像它被重写为包含原始子语句的复合语句。(例子:
if (x) int i;
可以等价地重写为
if (x) { int i; }
这意味着你写的代码可以重写为:
if(test_1)
{
if(test_2)
{
// Do stuff
}
else
{
exit(0);
}
}
定义良好。else
总是与最近的可用if
配对
它是在c中定义的。一个else
总是与最近的if
配对;因此,您应该使用适当的大括号来避免歧义。
是的,它不是模棱两可的,因为规则声明它应用在哪里,但是我的GCC c++编译器仍然给出警告,说明它是:
/brainModule/brainModule .cpp:在函数' void failExpiredPendingAndRunning() '中:./brainModule/brainModule .cpp:158:16: 警告:建议显式大括号避免歧义的' else ' [-Wparentheses]if (job->isExpired() == false)
g++ (Raspbian 6.3.0-18 + rpi1 + deb9u1) 6.3.0 20170516
- 此递归模板类型定义是否有效C++?
- 虚拟成员函数的定义是否强制在同一转换单元中动态初始化静态数据成员?
- 越界成员函数定义是否需要一个完全限定的类名,直到全局范围
- C++标准是否定义了结构中成员函数的函数内定义是否必须具有静态链接?
- 带有"struct structname<..>"的模板定义是否正确?
- NTRUEncrypt:使用开源标准算法中的描述无法正确找到两个多项式的GCD,无法定义是否存在多边形的逆
- 定义重载C++函数模板的原型时,使用其名称引用以前的定义是否合法?
- 命名空间的定义是否可以跨越多个翻译单元
- 头文件中的类声明和定义是否在每个包含上编译
- 这个无括号的C预处理器定义是否安全
- char的实现定义是否会影响std::string
- 对内联函数有不同的定义是否是一种未定义的行为
- 同一字符串的多个#定义是否使用相同的常量字符串
- 根据编译时常量,使用相同的标识符 #define 或类型定义是否被认为是可接受的做法?
- 显式模板实例化定义是否也抑制隐式实例化
- 构造函数定义是否可以以 "class" 关键字为前缀?
- 类中的函数定义是否占用类大小的一部分?
- 名称空间作用域构造函数定义是否需要类限定的标识符
- i=i++;未定义.是否i=foo(i++)也未定义
- "volatile"的定义是否如此不稳定,还是 GCC 存在一些标准合规性问题?