我被委派为公司重写一些旧软件,发现源代码中有一个有趣的结构。
switch(X){
if(Y==Z){
case A: ... break;
case B: ... break;
}
case C: ... break;
default: ...;
}
编译器警告我,if语句内的代码将不会被执行,但在测试时似乎if语句没有被验证,然而case语句却是被验证了。
可能有一些原因,比如早期的C ++编程时期,因为其中一些代码已经超过20年了,你会写出这样的结构吗?由于它在生产代码中,所以它似乎确实会做一些事情?
如果您知道这样做的原因,并且编译器似乎可以忽略它,请告诉我。谢谢!
编辑:这种情况发生了多次,因此它似乎不是一个简单的错误。这就是让我感到困惑的地方。
编辑2:这里是我用于测试的示例。我不确定它是否有帮助,不过原始代码位于一个包含1200行的怪兽函数中,因此从中创建一个测试用例基本上是不可能的。
for (int i=0; i<5;i++)
{
switch(i)
{
if (i==0 || i ==1)
{
cout << "reached before case";
case 0: cout << "inside case 0" << std::endl; break;
case 1: cout << "inside case 1" << std::endl; break;
case 2: cout << "inside case 2" << std::endl; break;
}
case 3: cout << "inside case 3" << std::endl; break;
default: cout << "inside default" << std::endl;
}
}
if
语句没有起到任何作用。在过去可能会有一些作用,比如之前有一个case
语句但后来被移除了。如果你正在使用git或svn等版本控制工具,可以尝试通过"blame"命令查找代码,找出是谁编写的,然后询问他们的意图。 - François Andrieuxif
比switch
更早存在。但是,switch
在这方面的行为非常类似于goto
,即使在旧版本的 C++ 中也是如此。该代码要求Y==Z
可以编译,但比较在运行时从未进行。 - Drew Dormannswitch
语句中可以用一些奇怪的结构,比如Duff's device。这可能是一种优化尝试,但在我看来同样有可能只是一个旧的bug(在语法上有效,但在语义上不正确),而较老的编译器没有发出警告。 - 0x5453