任何常用的编程语言都具备一组公共的语法特性,不同的语言仅在特征的细节上有所区别。要想学习并掌握一种编程语言,理解其语法特征的实现细节是第一步。最基本的特征包括:
- 整型、字符型等内置类型
- 变量,用来为对象命名
- 表达式和语句,用于操作上述数据类型的具体值
- if或者while等控制结构,这些结构允许我们有选择的执行一些语句或者重复的执行一些语句
- 函数,用于定义可供随时调用的计算单元
这一段说的太好了,让我感觉理解了程序的本质
下面是正题:
- 数据类型是程序的基础:它告诉我们数据的意义以及我们能在数据上执行的操作。
- C++定义了一套包括算数类型和空类型在内的基本数据类型,其中算数类型包括整形(含字符和布尔型)和浮点型。算数类型的尺寸(占的比特数)在不同的机器上有所差别。(最懒得看这些了,但是某公司笔试居然考了==)下表列举了C++标准规定的尺寸最小值,同时允许编译器赋予这些类型更大的尺寸(所以说可能不同的编译器结果也不一样)。
-
基本的字符类型是 char,一个char的空间应确保可以存放机器基本字符集中的任意字符对应的数字值,也就是说一个char的大小跟一个机器字节一样。Unicode 是用于表示所有自然语言的字符的标准。C++:算数类型 类型 含义 最小尺寸 bool 布尔类型 未定义 char 字符 8 wchar_t 宽字符 16 char16_t Unicode字符 16 char32_t Unicode字符 32 short 短整型 16 int 整型 16 long 长整型 32 long long 长整型 64 float 单精度浮点型 6位有效数字 double 双精度浮点型 10位有效数字 long double 扩展精度浮点型 10位有效数字 - 说到这里,想起了前段时间看到的,浮点型在内存中是如何存储的。http://www.cnblogs.com/fly-height/articles/2340396.html
- 选择类型:大多数程序员能够也应该对数据类型的使用做出限定从而简化选择过程。以下是选择类型的一些经验准则:
- 当明确知晓数值不能为负值,选用无符号类型
- 使用int进行整数运算。short太小,而long一般和int 有一样的尺寸,若超了int范围,用long long
- 算术表达式中不要用char 或者 bool,因为char在一些机器上是有符号的,在另一些上是无符号的,所以用char运算特别容易出问题。如果就是要用,明确sighed和unsigned
- 浮点运算选用double,因为float通常精度不够而且双精度和单精度浮点计算代价相差无几。
T。T标号好难用。。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
类型转换
- 浮点数赋值给整数类型,结果仅保留浮点数中小数点之前的部分。
- 当我们赋给无符号类型一个超出它表示范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数,如-1给unsigned char 结果是255.
- 当我们赋给带符号类型一个超出它表示范围的值时,结果是未定义的,此时,程序可能继续工作、可能崩溃也可能生成垃圾数据。
- 程序应该尽量避免依赖于实现环境的行为,如果把int尺寸看成是确定不变的已知量,那么这样的程序就称作不可移植的。
- 尽管我们不会故意给无符号对象赋一个负值,但是却很可能写出这么做的代码。当一个算术表达式中既有无符号数又有int 时,那个int值就会转换成无符号数。
for(int i=10;i>=0;--i) std::cout<<i<<std::endl; //错误:变脸u永远也不会小于0,循环条件一直成立 for(unsigned u =10;u>=0;--u) std::cout<<u<<std::endl;
字面值常量
- 字符串字面值的实际长度比它的内容多1,这是字符串结尾处的\0
- 如果两个字符串字面值位置紧邻且仅由空格、缩进和换行符分隔,则它们实际上是一个整体。当书写的字符串字面值比较长,写在一行里不太合适,就可以采取分开书写的方式:
// 分多行书写的字符创字面值 cout<<"a really,really long string literal" "that spans two lines."<<endl;
转义序列
两类字符程序员不能直接使用:不可打印字符,在C++语言中有特殊含义的字符。此时需要用到转义序列:
以反斜线作为开始
换行符 | \n | 横向制表符 | \t | 报警(响铃)符 | \a |
纵向制表符 | \v | 退格符 | \b | 双引号 | \" |
反斜线 | \\ | 问号 | \? | 单引号 | \' |
回车符 | \r | 进纸符 | \f |
泛化的转义序列,\x后跟1个或多个十六进制数字,或者 \ 后跟1、2、3个八进制数字。
变量
默认初始化
默认值由变量类型决定,同时变量的定义位置也会有影响。
如果是内置类型的变量未被显示初始化,他的值由定义的位置决定。如全局变量初始为0,函数内,未定义,
如果试图拷贝或以其他形式访问此类值将引发错误。
变量声明和定义的关系
C++支持
分离式编译机制,该机制允许将程序分割为若干个文件,每个文件可被独立编译。为了支持分离式编译,C++语言将声明和定义区分开来。变量声明规定了变量的类型和名字,在这一点上定义与之相同,但是除此之外,定义还申请存储空间,也可能为变量赋一个初值。
如果要声明一个变量而非定义它,就在变量名前添加关键字 extern ,而且不要显示的初始化变量:
extern int i;// 声明 i 而非定义 i
int j; // 声明并定义 j
任何包含了显示初始化的声明即成为定义。
extern double pi = 3.1416;// 定义
// 抵消了extern 的作用
变量只能被定义一次,但是可以被多次声明。
标识符
C++标识符由字母、数字、下划线组成,且必须以字母或下划线开头。长度没限制,但是大小写敏感。
用户自定义标识符不能连续出现两个下划线,也不能下划线紧连大写字母开头。定义在函数体外的标识符不能以下划线开头。