最近出现了一个问题,这对我来说是一次学习经历。类似以下内容给出了“使用未定义”错误:
int a;
for(int i = 0; i < 1; i++)
a = 2;
a /= 2;
这是一个人为的例子,没有意义,但它给出了所需的错误。我知道使用内部范围来设置变量值是完全可以的,只要编译器可以计算出所有流程都会导致明确的分配:
int a;
if(someboolean)
a=2;
else
a=4;
但我以前没有意识到取决于某个变量值的内部范围块会出错,即使没有可察觉的变量可能是“错误”的方式:
int a;
bool alwaysTrue = true;
if(alwaysTrue)
a = 2;
a /= 2; //error
用编译时间常数解决这个问题很好:
int a;
if(true)
a = 2;
a /= 2; //fine
我想知道这是否可能是因为编译器完全删除了 if,但更复杂的语句也可以:
int a;
for(int i = 0; true; i++){
a = 2;
if(i >= 10)
break;
}
a /= 2; //fine
也许这也被内联/优化了,但我的问题的本质是,对于第一个简单循环for(int i = 0; i < 1; i++)
,实际上是否有任何可以想象的方式使循环不会运行,因此“变量 a 可能未分配”是一个有效的断言,或者静态流分析是否只是在一个简单的“任何设置变量的条件控制代码块a
被自动认为存在它可能无法运行的情况,我们直接捷径显示后续使用错误”规则上运行?