为什么这么糟糕?
if (true)
int stuff = 10;
else
int stuff = 5;
printf("Stuff is %d\n",stuff);
是否因为范围?
答案 0 :(得分:9)
是。 stuff
仅存在于if
和else
块的范围内(它们是两个不同的变量)。你必须在if-else之外声明它才能工作。
int stuff;
if (true)
stuff = 10;
else
stuff = 5;
printf("Stuff is %d\n",stuff);
答案 1 :(得分:7)
你的问题被标记为C和C ++。答案在两种语言中有所不同。
在C和C ++中,if
语句的两个分支必须是语句:
if (
表达 )
声明 else
声明
其中语句通常是复合语句/块。
在C中,声明不是声明,因此您的代码只是语法错误。此外,除非您有true
,否则单词#include <stdbool.h>
不可见。 (就此而言,printf
除非您有#include <stdio.h>
,否则不可见,但由于您发布的内容是较大程序的一部分,我们可能会认为。)
你可以通过添加花括号来使if / else语句在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语句之前,然后分配给它而不是初始化它。
您可以通过其他几种方式构建代码,具体取决于您尝试执行的操作(从您发布的代码中无法判断)。
答案 2 :(得分:2)
定义像这样的代码:
int stuff;
if (true)
stuff = 10;
else
stuff = 5;
printf("Stuff is %d\n",stuff);
您可以阅读有关c ++范围here的信息。