ANSI C和ANSI C++中的const修饰符

const modifiers In ANSI C and ANSI C++

本文关键字:ANSI const 中的 C++      更新时间:2023-10-16

这是真的吗?

1.如果我们单独使用const修饰符,它默认为int。例如,

const size = 10;

const int size =10; 

2.ANSI C不要求初始值设定项常量;如果未给定,则将const初始化为0。例如,

const int i;

const i = 0;

请根据ANSI标准

给出答案
  1. C89/90也是如此。对于C99或C++来说,情况并非如此。"隐式int"规则在C99中是非法的,在C++中从未存在过。

    然而,

    const size 10;
    

    不是有效的C语法。=仍然是必需的。一个非常古老的C标准前版本(称为CRM C)使用了没有=的初始化语法,但该语言版本中甚至还没有const

  2. 不是这样。在C中,具有静态存储持续时间的对象默认为零初始化。这意味着,例如,任何文件范围对象在默认情况下都是零初始化的,无论它是否为const。默认情况下,无论局部变量是否为const,它们都不会初始化为零。换句话说,这个问题与const完全无关。

    C++实现了类似的规范。在进行任何其他初始化之前,所有具有静态存储持续时间的对象都是零初始化的。

http://ideone.com/kl9CZ不,这不是真的。

C允许默认的int,但直到1999年,他们才将其定为非法。很久以前,在MSVC 2003的C++中,变量默认为int,但在标准C++中,自从该语言标准化以来,这一直是非法的。事实上,当我在最新版本的MSVC中键入您的代码时,我会收到错误消息:

错误C4430:缺少类型说明符-假定为int。注意:C++不支持默认的int

据我所知,在C或C++中,去掉=是不合法的。

一些的情况,其中C和C++将零初始化变量为零,但在这些情况下,你有一些类似int a = int();的东西,全局/静态是零初始化的。在您的代码中,(如果它们在函数中)C和C++都不会对这些变量进行零初始化。

根据标准(C99,我没有检查C++或早期的C版本),这两个都不是真的。

  1. 如果您查看声明的语法定义(第6.7节),您会发现类型说明符不是可选的。

  2. 在默认初始化(第6.7.8节)中,我们发现以下内容:

    如果具有自动存储持续时间的对象未初始化明确地说,它的值是不确定的。如果对象具有静态存储持续时间未明确初始化,则:

    • 如果它是算术类型,则初始化为(正或无符号)零

    这里没有关于const的内容。