为什么这么糟?
if (true)
int stuff = 10;
else
int stuff = 5;
printf("Stuff is %d\n",stuff);
是因为范围吗?
最佳答案
你的问题被标记为C和C++。这两种语言的答案不同。
在C和C++中,if
语句的两个分支必须是语句:if (
表达式)
语句else
语句
其中,语句通常是复合语句/块。
在C语言中,声明不是语句,所以代码只是语法错误。此外,除非您有一个true
,否则单词#include <stdbool.h>
是不可见的。(对于这个问题,printf
是不可见的,除非您有一个#include <stdio.h>
,但是由于您发布的是一个较大程序的片段,我们可能会假设这一点。)
您可以通过添加卷轴括号(通常是很好的实践)使I/OR语句在C和C++中都有效:
if (true) {
int stuff = 10;
}
else {
int stuff = 5;
}
现在更清楚的是,您已经声明了两个不同的变量,都名为
stuff
。它们的范围都在最近的封闭块的末尾结束;在这种情况下,这是紧随其后的}
:if (true) {
int stuff = 10; // stuff is visible here
} // and now stuff is no longer visible
else {
int stuff = 5; // the other stuff is visible here
} // and now is no longer visible
块结束后,
stuff
不再可见它甚至不存在,因为它已经到达了它生命的尽头。这是两件不同的事情:作用域是程序文本的一个区域,生存期是运行程序的执行时间的子集。stuff
只在代码声明之后和封闭的}
之前对代码可见。在运行时,对象stuff
仅存在,直到执行到结束}
。所以是的,主要的问题是范围。您有两个不同的变量,都被命名为
stuff
,而且它们对printf
调用都不可见。要解决这个问题,正如其他答案已经说过的那样,将
stuff
的声明移到if/else语句之前,并将其赋值,而不是初始化它。根据您要做的工作(从您发布的代码中无法分辨),您还可以使用其他几种方法来构造代码。