原则上,在调用main()之前初始化在任何函数外部定义的变量(即全局,名称空间和类静态变量)。翻译单元中的此类非本地变量按其声明顺序初始化
以上是我的讲师给出的课堂笔记。
#include <iostream>
using namespace std;
int a=99;
int b;
int main(int argc, char *argv[])
{
cout<<a<<endl;
cout<<b<<endl;
return 0;
}
b=100;
我运行时出错。在调用main()之前将'b'分配给100是不是真的?错误是C++ requires a type specifier for all declarations
答案 0 :(得分:5)
这里的问题不是初始化顺序:b
确实在main
开始运行之前初始化。
问题是b
的“可见性”。在编译main
时, 没有b
。
您可以通过将b
的定义/初始化移至main
之前来解决此问题:
#include <iostream>
using namespace std;
int a = 99;
int b = 100;
int main (int argc, char *argv[]) {
cout << a << '\n';
cout << b << '\n';
return 0;
}
或只是表明b
存在:
#include <iostream>
using namespace std;
int a = 99;
extern int b;
int main (int argc, char *argv[]) {
cout << a << '\n';
cout << b << '\n';
return 0;
}
int b = 100;
在运行时创建或初始化b
时,这两个解决方案都不会更改,只需在b
内提供main
。
答案 1 :(得分:2)
问题在于:cout<<b<<endl;
在声明声明之前,您无法访问该变量。
答案 2 :(得分:2)
仔细阅读。
在调用main(未编译)之前初始化在任何函数(B)之外定义的变量。
要正确编译B应该在第一次使用之前定义(并声明)(这是你的错误:B在被声明之前被使用过。)
答案 3 :(得分:2)
你的讲师错了;全局变量按定义的顺序初始化,而不是声明。
例如,
#include <iostream>
struct S { S(const char *s) { std::cout << s << '\n'; } };
extern S a; // declaration
extern S b; // declaration
int main() { }
S b("b"); // definition
S a("a"); // definition
将打印
b
a
您发布的代码不起作用,因为b
在使用时甚至没有声明。声明(例如,extern int b
)是必需的,因为C ++(如C)最初设计为one-pass compiler。
答案 4 :(得分:0)
问题是语句b=100;
:不能在全局范围内放置语句(变量初始化除外)。
如果此行保持原样,无论 b
声明/定义如何或在 b
内或任何地方使用 main
,代码都不会编译。
没有这一行,代码是正确的并且可以工作,b
的值等于 0
,因为未初始化的全局变量被初始化为 0(或者 b=100;
行可以移动到任何函数作用域)。