声明不被视为有效

时间:2014-05-30 20:33:42

标签: c++ c scope

为什么这么糟糕?

if (true)
    int stuff = 10;
else
    int stuff = 5;

printf("Stuff is %d\n",stuff);

是否因为范围?

3 个答案:

答案 0 :(得分:9)

是。 stuff仅存在于ifelse块的范围内(它们是两个不同的变量)。你必须在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的信息。