c++ - 声明无效

扫码查看

为什么这么糟?

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语句之前,并将其赋值,而不是初始化它。
根据您要做的工作(从您发布的代码中无法分辨),您还可以使用其他几种方法来构造代码。

10-01 19:52
查看更多