声明被认为无效

Declaration is not considered valid

本文关键字:无效 被认为 声明      更新时间:2023-10-16

为什么不好?

if (true)
    int stuff = 10;
else
    int stuff = 5;
printf("Stuff is %dn",stuff);

是因为作用域吗?

是。stuff只存在于ifelse块的范围内(它们是两个不同的变量)。你必须在if-else之外声明它才能工作。

int stuff;
if (true)
    stuff = 10;
else
    stuff = 5;
printf("Stuff is %dn",stuff);

你的问题被标记为C和c++。这两种语言的答案是不同的。

在C和c++中,if语句的两个分支都必须是语句:

if ( expression ) statement else statement

,其中语句通常是复合语句块。

在C中,声明不是语句,所以你的代码只是一个语法错误。此外,除非有#include <stdbool.h>,否则单词true是不可见的。(对于这件事,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语句之前,并对其进行赋值而不是初始化。

还有其他几种方法可以构建代码,这取决于你想做什么(这是不可能从你发布的代码中分辨出来的)。

像这样定义代码:

int stuff;
if (true)
    stuff = 10;
else
    stuff = 5;
printf("Stuff is %dn",stuff);