c语言初始化列表,Initialization(初始化)
对象的声明可以通过称为初始化的过程提供其初始值。
对于每个声明符,如果不省略,初始化符可能是以下之一:
= expression(1)= { initializer-list }(2)
其中 initializer-list 是一个非空的以逗号分隔的初始化器列表(带有可选的尾随逗号),其中每个初始化器都有三种可能的形式之一:
expression(1){ initializer-list }(2)
designator-list = initializer(3)
其中,指定者列表是表单标识符的[常量表达式]或结构/联合成员指示符形式的数组指示符的列表.; 请参阅数组初始化和结构初始化
说明
初始化程序指定存储在对象中的初始值。
显式初始化
如果提供了初始化程序,请参阅。
标量类型初始化的标量初始化
数组初始化用于数组类型的初始化
结构初始化用于结构和联合类型的初始化。
隐式初始化
如果未提供初始化程序:
具有自动存储持续时间的对象被初始化为不确定的值(可能是陷阱表示)
具有静态和线程局部存储持续时间的对象按如下进行初始化
指针被初始化为它们类型的空指针值
整型的对象被初始化为无符号零
浮动类型的对象被初始化为正零
数组成员,结构体和联合体如上所述进行初始化,递归地加上所有填充位被初始化为零
(在空指针和浮点零都具有全零位表示的平台上,静态初始化的这种形式通常通过在程序映像的.bss节中分配来实现)
笔记
初始化静态或线程局部存储持续时间的对象时,初始化程序中的每个表达式都必须是常量表达式或字符串常量。
初始化器不能用于不完整类型的对象,VLA 和具有链接的块范围对象的声明。
函数参数的初始值是通过从函数调用的参数中分配而不是通过初始化(直到C11之后的缺陷报告 DR 427,其改变了使用初始化的措辞)而建立的。
如果将不确定值用作任何标准库调用的参数,则行为是未定义的。否则,任何涉及不确定值的表达式的结果都是不确定的值(例如,int n;可能不会与自身等同,并且可能会在后续读取中更改它的值)。
例
#include int a[2]; // initializes a to {0, 0}int main(void){
int i; // initializes i to an indeterminate value static int j; // initializes j to 0
int k = 1; // initializes k to 1
// initializes int x[3] to 1,3,5 // initializes int* p to &x[0]
int x[] = { 1, 3, 5 }, *p = x;
// initializes w (an array of two structs) to // { { {1,0,0}, 0}, { {2,0,0}, 0} }
struct {int a[3], b;} w[] = {[0].a = {1}, [1].a[0] = 2};
// function call expression can be used for a local variable
char* ptr = malloc(10); free(ptr); // Error: objects with static storage duration require constant initializers// static char* ptr = malloc(10); // Error: VLA cannot be initialized// int vla[n] = {0};}
参考
C11 standard (ISO/IEC 9899:2011):6.7.9 Initialization (p: 139-144)
C99 standard (ISO/IEC 9899:1999):6.7.8 Initialization (p: 125-130)
C89/C90 standard (ISO/IEC 9899:1990):3.5.7 Initialization
c语言初始化列表,Initialization(初始化)相关推荐
- C++新特性探究(八):初始化列表(Initialization List)再探究
相关博文:C++新特性探究(七):初始化列表(Initialization List) 相关博文:C++新特性探究(八):初始化列表(Initialization List)再探究 相关博文:C++之 ...
- C++新特性探究(七):初始化列表(Initialization List)
前文:C++之构造函数和(构造)函数重载探究 相关博文:C++新特性探究(七):初始化列表(Initialization List) 相关博文:C++新特性探究(八):初始化列表(Initializa ...
- C++之关于初始化列表(Initialization List)的一个补充示例
相关博文:C++新特性探究(七):初始化列表(Initialization List) 相关博文:C++新特性探究(八):初始化列表(Initialization List)再探究 相关博文:C++之 ...
- 28.构造函数中,成员变量一定要通过初始化列表来初始化的?
首先要明确:如果对象成员是const或者引用的话,必须将其初始化! 构造函数中,成员变量一定要通过初始化列表来初始化的的几种情况! 1)对象成员是const或者引用 #include <iost ...
- 为什么不能在子类的初始化列表里初始化父类的成员
好几次遇到此类问题了:便不得不找些资料弄明白它: 具体代码是: 2 3 4 5 6 7 8 9 10 class A { protected: int n_; }; class B : pub ...
- C++经典问题:如果对象A中有对象成员B,对象B没有默认构造函数,那么对象A必须在初始化列表中初始化对象B?
对象成员特点总结: (1)实例化对象A时,如果对象A有对象成员B,那么先执行对象B的构造函数,再执行A的构造函数. (2)如果对象A中有对象成员B,那么销毁对象A时,先执行对象A的析构函数,再执行B的 ...
- C++类构造函数初始化列表及初始化成员变量的误区
构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式.例如: [cpp] view plaincopy class CExample { pub ...
- [面试] C++ 语法(一) —— 初始化列表的初始化顺序
首先来看一道经典的 C++ 面试题: (1)初始化列表的初始化顺序:不是按照列表的顺序进行的 (2)初始化列表的初始化顺序:是按照内存模型中的成员变量的顺序(也即类声明的定义顺序)进行的: (3)也即 ...
- 子类初始化列表不能初始化父类元素 -- class 'Derived' does not have any field named 'x'
缘由 偶尔编写如下代码,编译出错, class Base{public:int x; };class Derived : public Base {public:Derived() : x(10) { ...
- C++必须使用【初始化列表】初始化数据成员的三种情况
类对象的构造顺序是这样的: 1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员: 2.进入构造函数后在构造函数中执行一般赋值与计算. 使用初始化列表有两个原因: 原因1.必须这样做: < ...
最新文章
- Redis缓存穿透击穿雪崩
- Typedef用法(转载)
- 机器学习特征工程之特征缩放+无量纲化:数据标准化(StandardScaler)
- python 使用 redis expire属性设置访问时间间隔
- linux内核PID管理--命名空间
- pdf.js 在线阅读PDF
- android 小球效果,Android开发实现跟随手指的小球效果示例
- 标准库函数、系统调用的区别
- FastDFS java api调用
- vlc 缓冲大小 设置_用libvlc 播放指定缓冲区中的视频流
- 家庭用计算机怎样选择设置网络位置,win7系统怎么选择网络位置
- 前端笔试能查吗_鹅厂微博前端实习面经
- 运维提效 60%,视野数科 SAE + Jenkins 打造云原生 DevOps
- 关于水晶报表打包的一些注意的地方!
- 批处理顺序执行多条命令
- L298N 电机驱动板 - 详细介绍
- 截获HTTP/HTTPS请求实现头脑王者辅助
- axure能做剪切蒙版吗_***自动售货机能做吗
- 老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问。当然,老师有时候需要更新某位同学的成绩. 输入描述:
- 应届学弟咨询:是去华为拿1万多低薪,还是去二线自研公司拿2万多高薪?.....