外部变量初始化与常量表达式

代码:

#include <stdio.h>
#include <stdlib.h>

// 外部存储类(external storage class):具备文件作用域、外部链接和静态存储时期的类型
// 外部变量(external variable):具备外部存储类的变量
int a;

// 外部变量如果不进行显式初始化,会被自动赋初值0
int b;
int ages[10];

// 文件作用域变量只可用常量表达式初始化
// 只要不是变长数组,sizeof表达式就被认为是常量表达式
int len = 20;
int d = sizeof(int) * 5;

// 下面这个sizeof表达式不是常量表达式
// sizeof(int [len]) * 5

int main(void) {

	return EXIT_SUCCESS;
}
时间: 2024-10-13 23:32:26

外部变量初始化与常量表达式的相关文章

constexpr与常量表达式(c++11标准)

常量表达式(const expression):是指值不会改变并且在编译过程中就得到计算结果的表达式.(运行中得到结果的不能成为常量表达式). const int i=3;    //是一个常量表达式 const int j=i+1; //是一个常量表达式 int k=23;        //k的值可以改变,从而不是一个常量表达式 const int m=f(); //不是常量表达式,m的值只有在运行时才会获取. constexpr变量: C++11允许声明constexpr类型来由编译器检验

C语言---程序的一般形式、数据类型、常量变量、运算符、表达式、格式化输入输出

1. 程序的一般形式 (1)注释 ① 分类:单行注释( // ): 注释一行.多行注释( /**/ ): 在这个区间内,都属于多行注释,可以换行. ② 作用:提示代码的作用,提示思路   不写注释的后果:出来混总是要还的. ③ 单行注释不能换行 (2) #include  #import ① 导入文件,系统提供类库文件中包含一些功能函数,如果想在某个文件中使用,必须导入需要的文件. ② stdio  标准输入输出  standard input output (3) main  函数,又称主函数

关于Lambda表达式访问外部变量

在<C#高级编程>一书中提到通过Lambda表达式可以访问Lambda表达式块外部的变量 ,这是一个很好的功能(类似Js中的 闭包).但是如果没有正确的使用,会非常危险. 比如下面的事例中 int someVal  = 5; Fun<int, int> f = x => x + someVal; Console.WriteLine(f(3)); 我们这个表达式的本意是返回一个数x+5的结果.所以f(3)的结果应该是 3 + someVal = 8. 但是如果以后在不经意中修改

变量、操作符、表达式

变量.操作符.表达式 1.语句是能执行一个操作的命令.最简单也是最重要的一个C#语法规则:必须用一个分号来终止所有语句. 2.标识符遵循的规则: ▲只能使用字母.数字.下划线字符 ▲标识符必须以一个字母或者下划线开头 3.关键字及其含义 关键字 含义 abstract 标识一个可以扩展但不能被实体化的,必须被实现的类或方法. as 一个转换操作符,如果转换失败,就返回null. base 用于访问被派生类或构造中的同名成员隐藏的基类成员. bool 表示布尔值的简单类型. break 用于从lo

深入研究Block捕获外部变量和__block实现原理

Blocks是C语言的扩充功能,而Apple 在OS X Snow Leopard 和 iOS 4中引入了这个新功能“Blocks”.从那开始,Block就出现在iOS和Mac系统各个API中,并被大家广泛使用.一句话来形容Blocks,带有自动变量(局部变量)的匿名函数. Block在OC中的实现如下: struct Block_layout { void *isa; int flags; int reserved; void (*invoke)(void *, ...); struct Bl

c++ 11学习笔记-- 常量表达式(constexpr)

最新在弄android ndk相关的,惊奇的发现最新的ndk10的版本已经gcc4.9了,我印象中,gcc4.8就支持C++0x11,14的支持,gcc再次走到了llvm的前面,LLVM最新的版本3.4.2应该只支持c++ 11,如果是同样的c++代码我一直认为llvm的效率会明显强过gcc. 废话不多说,让我们开始学习c++ 11吧,说实话我之前一直都很抗拒c++新的语法,感觉太难接受了,现在看来不熟悉也不行了. 常量表达式(constexpr) 常量表达式机制是为了: 提供了更多的通用的值不

类的成员变量初始化总结

1. C++变量的初始化方式 首先把需要初始化的成员变量分为几类: ?  一般变量(int) ?  静态成员变量(static int) ?  常量(const int ) ?  静态常量(static const int) 对应的初始化方式是: ?  一般变量可以在初始化列表里或者构造函数里初始化,不能直接初始化或者类外初始化 ?  静态成员变量必须在类外初始化 ?  常量必须在初始化列表里初始化 ?  静态常量必须只能在定义的时候初始化(定义时直接初始化) 举一个简单的例子: [cpp] v

常量表达式

常量表达式 Item 1:如果函数必须在编译期进行求值,就将其声明为constexpr 理由 需要用constexpr来告诉编译器允许对其进行编译期求值. 示例 阶乘的例子: constexpr int fac(int n) //constexpr函数 { return (n>1) ? n*fac(n-1) : 1; } void f(int n) { int f5 = fac(5); //在编译期间可能进行了求值 int fn = fac(n); //在运行期间进行了求值(因为实参n是变量)

【C++】constexpr和常量表达式

常量表达式(const expression)是指值不会改变并且在编译过程就能得到计算结果的表达式.显然,字面值属于常量表达式,用常量表达式初始化的const对象也是常量表达式.后面将提到,C++语言有几种情况下是要用到常量表达式的. 一个对象(或者表达式)是不是常量表达式由它的数据类型和初始值共同决定,例如: const int max_files = 20; //max_files是常量表达式 const int limit = max_files + 1; //limit是常量表达式 in