声明被认为无效
Declaration is not considered valid
为什么不好?
if (true)
int stuff = 10;
else
int stuff = 5;
printf("Stuff is %dn",stuff);
是因为作用域吗?
是。stuff
只存在于if
和else
块的范围内(它们是两个不同的变量)。你必须在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);
- 为什么rand()的使用被认为是不好的
- 为什么 std::shared_ptr 被认为是"heavy"和"expensive",但 std::array "same perfprmance as plain (c-style) arrays
- 一个C头文件可以被认为是一个接口吗
- 为什么const char*和const char[]作为函数参数被认为是等价的
- 为什么12.0==11.999999999999999999被认为是真的
- 这会被认为是糟糕的编程实践吗?
- 为什么这被认为是恒定的?
- 抽象类/接口中的空方法是否被认为是一种好的做法?
- 为什么右值引用被认为比右值引用更安全?
- 如果我具有调用其其他实例之一的超载函数,它是否被认为是递归功能
- 为什么null std ::可选的被认为小于任何值,而不是更多
- std::unique_ptr可以被认为是一个monad吗?
- C++ 指向类的指针和/或引用是否被认为是"movable"?
- 使用自定义宏来简化 cin 和 cout 语句等内容被认为是更好还是更差
- 使用成员函数更改对象或返回并分配它是否被认为是更好的做法?
- 使用 #define 被认为是"bad practice"吗?
- 是一个被认为是不同类型的班级内部的正向声明
- 这被认为是有效的C 11还是C 14?还是GCC/Clang弄错了
- 为什么这个嵌套的 lambda 不被认为是 constexpr?
- 声明被认为无效