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

时间:2012-07-16 16:24:45

标签: c++ c ansi-c

这是真的吗?

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

const size = 10;

表示

const int size =10; 

2.ANSI C不需要const的初始化器;如果没有给出,则将const初始化为0.例如,

const int i;

表示

const i = 0;

请给ans。根据ANSI标准

3 个答案:

答案 0 :(得分:3)

  1. C89 / 90就是这样。对于C99或C ++,情况并非如此。 “隐含int”规则在C99中是非法的,在C ++中从未存在过。

    然而,

    const size 10;
    

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

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

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

答案 1 :(得分:1)

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

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

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

      

    如果未初始化具有自动存储持续时间的对象   显然,它的价值是不确定的。如果一个对象有静态   存储持续时间未明确初始化,然后:

         

    ...

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

    ...

    这里没有const

答案 2 :(得分:1)

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

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

  

错误C4430:缺少类型说明符 - 假设为int。注意:C ++不支持default-int

据我所知,遗漏=在C或C ++中从来都不合法。

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