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

时间:2019-07-19 06:11:36

标签: c global-variables

我在main函数之后再次声明了全局变量,但是它仍然会影响main函数。我知道C允许在第一次声明未初始化全局变量时再次声明全局变量(在c ++中不起作用)。如果我在main函数之后分配值,则它在c中仍然会出现两个警告,但在c ++中会给出错误。

我已经调试了代码,但从未到达int a=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;

输出为10

4 个答案:

答案 0 :(得分:6)

几件事:

  • 第一个int a;是临时声明;第二个int a = 10;是定义声明。

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

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

答案 1 :(得分:3)

这里

int a; /* global declaration */

编译器将上述声明视为声明 未定义。它在其他翻译单元中查找a的定义,在main()下方找到

int a=10;

因此输出10

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

extern int a;

答案 2 :(得分:2)

根据C Standard#6.9.2p2

  

2声明对象的标识符,该对象的文件范围没有初始化程序,没有存储类说明符或具有存储类说明符静态,则构成临时定义 ... ..

所以,这个

int a;

是标识符a的临时定义。

关于临时定义的点对:

  • 如果同一翻译单元中没有定义,则该临时定义将与初始化程序= 0一起充当实际定义。
  • 如果在同一翻译单元中早些时候或以后发现了实际的外部定义,则暂定定义仅用作声明。

在您的程序中,编译器在同一翻译单元中找到了a的定义:

int a=10;

因此,使用C编译器进行编译时,您将获得输出10

现在,关于使用C ++编译器进行编译时的错误:

如果您的程序中包含以下语句:

a=10;

这将在使用C ++编译器进行编译时产生错误,因为您缺少必需的类型说明符。但是此代码将使用C编译器进行编译,因为在旧版本的C(C89 / 90)中,如果缺少类型说明符,则它将默认设置为int。当然,使用C99和C11编译器进行编译时会收到警告消息,因为不再支持此隐式声明。

如果您的程序中包含以下语句:

int a=10;

C ++没有临时定义的概念,int a;是C ++中的定义。因此,由于One Definition Rule的概念,C ++编译器将给出错误-redefinition of 'a'

答案 3 :(得分:0)

我所知,当今的c ++编译器无法运行代码:

import 'package:collection/collection.dart';

class Bank {
  Function equals = const MapEquality().equals;
  Map<Map<String, String>, double> _exchangeRates = Map();

  void addExchangeRate(String from, String to, double i) {
    _exchangeRates[{from: to}] = i;
  }

  double getExchangeRate(String from, String to) {
    return _exchangeRates[_exchangeRates.keys.firstWhere((entry){
      return equals(entry, {from : to});
    })];
  }
}

void main() {
  Bank bank = Bank();
  bank.addExchangeRate('USD', 'CHF', 2);
  bank.addExchangeRate('INR', 'USD', 1 / 60);
  bank.addExchangeRate('INR', 'NRS', 160 / 100);
  print(bank.getExchangeRate('USD', 'CHF'));
  print(bank.getExchangeRate('INR', 'USD'));
  print(bank.getExchangeRate('INR', 'NRS'));
}

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

因为c ++检测到变量的双重声明。

因为它无法在方法外部初始化变量。

错误“'a'不命名类型”是因为(第二个)错误,c ++期望第一个单词是声明的类型(例如:int,long,char,-etc-),并且给出了变量。