数据类型是程序的基础,决定了数据的意义,也决定了我们能在数据上所执行的操作。
从http://www.cnblogs.com/Shuqing-cxw/p/9189411.html 2文件的本质可以知道,数据类型可以理解为固定大小内存的别名;
不同的数据类型,用于应对各种不同的需要;最简单的例如加减法使用整数型,而除法可能需要浮点类型更符合实际;
在存储空间中,使用数据类型来向整个存储空间申请一个相应大小的内存块以供使用;
通过使用数据类型来创建一些变量来形象具体的描述并操作这些固定大小的内存;
故可以看出,变量的本质就是一段实际连续存储空间的别名;即,所占用的内存大小同数据类型所占的空间大小,且变量需要依赖归属某个数据类型;
程序中通过变量来申请并命名某一存储空间;即术语中的声明
通过操作变量达到使用该存储空间的目的;
类型说明符 随后紧跟着由一个或多个变量名组成的列表,其中变量名以逗号分隔最后以分号结束;定义时可以为一个或多个变量赋初始值;
int sum, value; //声明并创建了sum和value变量,类型为int;
初始化变量就是为变量赋一个初始值。C/C++中,初始化在声明中完成,即只需要在变量名后面加上赋值运算符 = 和待赋给变量的值;
int sum = 0;
注意:初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,赋值的含义是把对象的当前值擦除,并以一个新值来替代。在声明变量时未进行初始化的变量所存储的数值是系统中所分配给该变量内存地址上的原值;
1 #include <stdio.h> 2 int main() 3 { 4 int n; 5 printf("n = %d\n", n); 6 n = 5; 7 printf("n = %d\n", n); 8 return 0; 9 }
计算机通过关闭和打开状态组合来表示信息,用二进制非常方便,即用0和1表示,即比特序列,现代计算机普遍1byte使用8bit表示。
1 Example:0377→377(8) 2 7=111 3 3=011 4 故0377 = 1111 1111 5 说明八进制若标识比377还大的数需要2字节来表示;
1 Example: 0xA3F→A3F(16) 2 A=1010 3 3=0011 4 F=1111 5 故0xA3F = 0000 1010 0011 1111 6 2个十六进制位符号表示一个8位比特序列,故以十六进制很方便表示字节值
1 /*C语言中显示不同的进制需要使用不同的转换说明: 2 *以十进制显示输出使用%d, 3 *以八进制显示输出使用%o或%#o(在数字前面显示进制代表符号) 4 *十六进制显示输出使用%x或%X或%#X; 5 */ 6 #include <stdio.h> 7 int main() 8 { 9 int i = 100; 10 printf("i_dec= %d, i_octal= %o, i_hex= %x\n", i, i, i); 11 printf("i_dec= %d, i_octal= %#o, i_hex= %#x\n", i, i, i); 12 return 0; 13 } 14 //C++显示输出示例 15 #include <iostream> 16 using namespace std; 17 int main() 18 { 19 int x = 100; 20 cout << "" << dec << x << endl 21 22 << "0" << oct << x << endl 23 24 << "0x" << hex << x << endl; 25 return 0; 26 }
小结:显然,八进制和十六进制记数系统在表达与计算机相关的值时比十进制方便,但需要主要的是使用不同的进制数是为了方便,不会影响数被存储的的方式,都是以二进制进行编码;
1 //类型与变量的关系 2 /* sizeof关键字返回字节数表示所占的内存大小,sizeof(variable) 3 * printf()函数为C语言打印输出函数,printf("转换说明",变量); 4 */ 5 #include <stdio.h> 6 int main() 7 { 8 9 char c; 10 int i; 11 12 printf("sizeof(char) = %d, sizeof(c) = %d\n", sizeof(char), sizeof(c)); 13 printf("sizeof(int ) = %d, sizeof(i) = %d\n", sizeof(int), sizeof(i)); 14 15 return 0; 16 }
结论:
1.变量必然隶属于某个数据类型;
2.变量所占用的内存大小取决于所归属的数据类型;
C/C++支持分离式编译机制,即将程序分割为若干个文件,每个文件可被单独编译;
为实现支持该机制,C/C++语言将声明和定义区分开来,声明使得名字为程序所知,一个文件如果想使用别处定义的名字则必须包含对那个名字的声明,而定义则负责创建于变量名字关联的实体
变量声明规定了变量的类型和名字,定义相比声明还做了申请存储空间的动作,如果可能还会为变量赋一个初始值(取决于用户);
若想声明一个变量而非定义它,就在变量名前添加关键字 extern,且不需要显式初始化变量;
1 extern int i; //声明i,而非定义i 2 3 int i; //声明并定义i
注意:
任何包含了显式初始化的声明,在概念上都会转变为定义
当extern关键字标记的变量显式赋给了一个初始值,编译器将会报错,不允许用户这样声明定义;
1 //test.h 2 int n = 5; 3 4 //main.c 5 #include <stdio.h> 6 #include "test.h" 7 int main() 8 { 9 extern int n; 10 printf("n = %d\n", n); 11 12 extern int n; 13 extern int n; 14 n = 6; 15 printf("n = %d\n", n); 16 17 extern int n = 0; //error 18 return 0; 19 }
小结:变量能且只能被定义一次,但可以被多次声明;
C++标识符由字母、数字、下划线组成,且必须以字母或下划线开头;标识符在发展至今一直区分大小写字母, 已放开了长度上的限制;
int somename, someName, SomeName, SOMENAME;//定义了4个变量
//C++ 关键字 alignas continue friend register true alignof decltype goto reinterpret_cast try asm default if return typedef auto delete inline short typeid bool do int signed typename break double long sizeof union case dynamic_cast mutable static unsigned catch else namespace static_assert using char enum new static_cast virtual char16_t explicit noexcept struct void char32_t export nullptr switch volatile class extern operator template wchar_t const false private this while constexptr float protected thread_local const_cast for public throw //C++操作符替代名 and bitand compl not_eq or_eq xor_eq and_eq bitor not or xor
原文:https://www.cnblogs.com/Shuqing-cxw/p/9190227.html