是.stuff仅存在于if和else块的范围内(它们是两个不同的变量).你必须在if-else之外声明它才能工作.
int stuff;
if (true)
stuff = 10;
else
stuff = 5;
printf("Stuff is %d\n",stuff);
Run Code Online (Sandbox Code Playgroud)
您的问题被标记为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;
}
Run Code Online (Sandbox Code Playgroud)
现在,你已经声明了两个不同的变量,两个都被命名,这一点变得更加清晰了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
Run Code Online (Sandbox Code Playgroud)
在块结束后,stuff不再是不再可见.它甚至不存在,因为它已达到其生命周期的终点.这是两个不同的东西:范围是程序文本的一个区域,而生命周期是正在运行的程序的执行时间的子集.stuff仅在声明之后和封闭之前对代码可见}.在运行时,该对象stuff仅在执行到达结束时存在}.
所以,是的,主要问题是范围.您有两个不同的变量,都是已命名的stuff,并且它们都不会对printf调用可见.
要解决这个问题,正如其他答案已经说过的stuff那样,在if/else语句之前移动声明,然后分配给它而不是初始化它.
您可以通过其他几种方式构建代码,具体取决于您尝试执行的操作(从您发布的代码中无法分辨).