C 全局变量的值在我的代码中是如何变化的?

C 全局变量的值在我的代码中是如何变化的?,c,global-variables,C,Global Variables,我在主函数之后再次声明了全局变量,但它仍然影响主函数。我知道C允许在第一次声明没有初始化变量时再次声明全局变量(它在C++中不起作用)。如果我在main函数之后赋值,它仍然在C中使用两个警告,但是在C++中给出错误。p> 我已经调试了代码,但它从来没有达到inta=10的行 #include <stdio.h> #include <string.h> int a; int main() { printf("%d",a); return 0; } /*a

我在主函数之后再次声明了全局变量,但它仍然影响主函数。我知道C允许在第一次声明没有初始化变量时再次声明全局变量(它在C++中不起作用)。如果我在main函数之后赋值,它仍然在C中使用两个警告,但是在C++中给出错误。p> 我已经调试了代码,但它从来没有达到
inta=10的行

#include <stdio.h>
#include <string.h>

int a;

int main()
{
    printf("%d",a);
    return 0;
}
/*a=10  works fine with following warnings in c.
        warning: data definition has no type or storage class
        warning: type defaults to 'int' in declaration of 'a' [-Wimplicit-int]|

        but c++ gives the following error
        error: 'a' does not name a type|
*/
int a=10;
#包括
#包括
INTA;
int main()
{
printf(“%d”,a);
返回0;
}
/*a=10可以正常工作,c中有以下警告。
警告:数据定义没有类型或存储类
警告:在“a”[-Wimplicit int]的声明中,类型默认为“int”|
但是C++给出了以下错误
错误:“a”未命名类型|
*/
INTA=10;
这里的输出是
10

int a; /* global declaration */
编译器将上述语句视为声明而不是定义。它在其他翻译单元中查找
a
的定义,在下面的
main()
中找到

int a=10;
因此,输出
10

为避免警告,请使用
extern
声明
a
,例如

extern int a;
有几件事:

  • 第一个
    inta是一个暂定声明;第二个
    inta=10是一个定义声明

  • a
    是在文件范围内声明的,因此它将具有
    static
    存储持续时间-这意味着在程序启动时(在
    main
    执行之前)将为其留出存储空间并进行初始化,即使定义声明稍后在源代码中出现

  • 旧版本的C允许隐式
    int
    声明-如果变量或函数调用没有声明,则假定其类型为
    int
    。C++不支持隐式声明,因此将得到错误。


  • 我知道,今天的C++编译器不能运行代码:

    int a;
    int main()
    {
        printf("%d",a);
        return 0;
    }
    int a=10;
    
    也不是

    因为C++检测变量的双声明。 和
    因为它无法在方法外部初始化变量

    错误:“a”不命名类型“是因为第二个错误,C++希望第一个单词是声明的类型(EX:int,Load,char,---等),并且给出变量。

    < P>从C标准中,第62.2P2

    2具有文件作用域的对象的标识符声明(不带初始值设定项、不带存储类说明符或带存储类说明符static)构成了一个暂定定义

    那么这个

    int a;
    
    是标识符
    a
    的暂定定义

    关于暂定定义的两点:

    • 如果同一翻译单元中没有定义,则暂定定义将充当初始值设定项
      =0
      的实际定义
    • 如果在同一翻译单元中更早或更晚找到实际的外部定义,则暂定定义仅充当声明
    在您的程序中,编译器在同一翻译单元中找到了
    a
    的定义:

    int a=10;
    
    因此,当使用C编译器编译时,您将获得输出
    10

    现在,关于C++编译器编译时的错误:

    如果您的程序中有此语句:

    a=10;
    
    int a=10;
    
    <>这将在编译C++编译器时出错,因为您缺少所需的类型说明符。但这段代码将使用C编译器编译,因为在旧版本的C(C89/90)中,如果缺少类型说明符,那么它将默认设置为
    int
    。当然,使用C99&C11编译器编译时会收到警告消息,因为不再支持此隐式声明

    如果您的程序中有此语句:

    a=10;
    
    int a=10;
    

    C++没有暂定定义和
    inta的概念是C++中的定义。所以,由于C++编译器的概念会给出错误-代码>重新定义‘A’< /COD>。因为C++是一种与C++不同的语言,尽管它有很多相似之处。用<代码>外部> /代码>声明C++允许。