在C ++中为全局变量赋值

时间:2020-03-28 03:11:03

标签: c++ programming-languages

我想知道为什么为全局变量赋值会导致错误

#include <iostream>

using namespace std;

int x = 5;
x = 3; // error: C++ requires a type specifier for all declarations

我不是刚刚在上面的行中声明了吗?好吧,让我们看看x是否存在;

int x = 5;
int x = 3; // error: redefinition of 'x'

Okey,因此确实同意定义了x,但是类型为“还不是” int。有人可以解释这种行为,您怎么称呼这种行为?它是怎么发生的?为什么要这样设计?

4 个答案:

答案 0 :(得分:5)

x = 3;表达式语句。表达式语句只能出现在块作用域内,即在函数体内。

在命名空间范围(全局范围/文件范围)中,您只能具有声明/定义,而没有分配。

答案 1 :(得分:2)

 int x = 5;
 x = 3; // error: C++ requires a type specifier for all declarations

在您提到的第一种情况下,int x = 5;是变量定义和初始化过程。全局变量可以在函数外部定义,但只能在函数中进行值分配。

int x = 5;
int x = 3; // error: redefinition of 'x'

int之前添加x = 3之后,变量x已被定义,并且其数据类型也已指定。您无法重新定义它。

答案 2 :(得分:1)

您只能在全局变量中定义和声明变量,但不能放置语句 和全球表达。

 int x = 5;
 x = 3; //expression 

并且何时执行x=3?但您可以通过

对其进行初始化
 int x = 5;

没关系。

答案 3 :(得分:1)

error: C++ requires a type specifier for all declarations

换句话说,在代码中放置在此位置的内容的选择是有限的。在有效选择中,声明最接近您编写的内容。如果添加类型说明符,则将有一个声明。这将是重新定义,但至少语法适合代码的这一部分。

含义是,在此刻,赋值不是有效的选择。赋值(与使用=的定义相反)只能在函数内部进行。

好像clang产生了特定的错误消息。您可能会发现gcc不太含糊:error: 'x' does not name a type

我不是刚刚在上面的行中声明了吗?

使用未声明的变量的错误消息看起来更像error: use of undeclared identifier 'x'。您没有收到此消息,因此断言此时未声明x尚为时过早。注意这样的细节是调试时的有用技能。