首页 > 代码库 > C++变量学习点
C++变量学习点
1:对于输入的值超出类型的取值范围的处理办法
编译器会将该值对 unsigned 类型的可能取值数目求模,然后取所得值。比如 8 位的 unsigned char,其取值范围从 0 到 255(包括 255)。如果赋给超出这个范围的值,那么编译器将会取该值对 256 求模后的值。例如,如果试图将 336 存储到 8 位的 unsigned char 中,则实际赋值为 80,因为 80 是 336 对 256 求模后的值。
#include <iostream>int main(){ unsigned char v; //0-255的取值范围 v = 257; std::cout << "v=" << v << std::endl; return 0;}
打印出来的是笑脸!!!!!!
2:字符串的连接
#include<iostream>int main(){ std::cout << "\nCC\toptions\tfile.[cC]\n" "shit"<< std::endl; return 0;}
3:左右值的定义
1. 左值(发音为 ell-value):左值可以出现在赋值语句的左边或右边。
2. 右值(发音为 are-value):右值只能出现在赋值的右边,不能出现在赋值语句的左边。
4:理解“初始化不是赋值”是必要的。初始化指创建变量并给它赋初始值,而赋值则是擦除对象的当前值并用新值代替。
5:复制初始化语法用等号(=),直接初始化则是把初始化式放在括号中:
int a(10);int a=10;
直接初始化语法更灵活且效率更高。
对内置类型来说,复制初始化和直接初始化几乎没有差别。对类类型的对象来说,有些初始化仅能用直接初始化完成。要想理解其中缘由,需要初步了解类是如何控制初始化的。
6:定义和声明
C++ 区分了声明和定义,变量的定义用于为变量分配存储空间,还可以为变量指定初始值。在一个程序中,变量有且仅有一个定义。
extern int i; // declares but does not define i int i; // declares and defines i
声明用于向程序表明变量的类型和名字,定义也是声明:当定义变量时我们声明了它的类型和名字。可以通过使用 extern 关键字声明变量名而不定义它。不定义变量的声明包括对象名、对象类型和对象类型前的关键字 extern: extern 声明不是定义,也不分配存储空间。事实上,它只是说明变量定义在程序的其他地方。程序中变量可以声明多次,但只能定义一次。
7:const的相关概念
const 对象局部于文件创建,非 const 变量默认为 extern。要使 const 变量能够在其他的文件中访问,必须指定它为 extern。
#include<iostream>#include<string.h> int main() { extern const int a;
extern int b; std::cout << a <<std::endl; return 0; } file-1#include <iostream>extern const int a = 3;
int b = 4;
8:typedef 可以用来定义类型的同义词
typedef 定义以关键字 typedef 开始,后面是数据类型和标识符。标识符或类型名并没有引入新的类型,而只是现有数据类型的同义词。typedef 名字可出现在程序中类型名可出现的任何位置。
1 为了隐藏特定类型的实现,强调使用类型的目的。
2 简化复杂的类型定义,使其更易理解。
3 允许一种类型用于多个目的,同时使得每次使用该类型的目的明确。
typedef double wages; // wages is a synonym for doubletypedef int exam_score; // exam_score is a synonym for int typedef wages salary; // indirect synonym for double
9:定义和初始化枚举
枚举的定义包括关键字 enum,其后是一个可选的枚举类型名,和一个用花括号括起来、用逗号分开的枚举成员列表。
// input is 0, output is 1, and append is 2
enum open_modes {input, output, append};
默认地,第一个枚举成员赋值为 0,后面的每个枚举成员赋的值比前面的大 1。
enum Forms {shape = 1, sphere, cylinder, polygon};
在 枚举类型 Forms 中,显式将 shape 赋值为 1。其他枚举成员隐式初始化:sphere 初始化为 2,cylinder 初始化为 3,polygon 初始化为 4。
enum Points { point2d = 2, point2w,
point3d = 3, point3w };
枚举成员 point2d 显式初始化为 2。下一个枚举成员 point2w 默认初始化,即它的值比前一枚举成员的值大 1。因此 point2w 初始化为 3。枚举成员 point3d 显式初始化为 3。一样,point3w 默认初始化,结果为 4。
不能改变枚举成员的值。枚举成员本身就是一个常量表达式,所以也可用于需要常量表达式的任何地方。
10:头文件的相关规定
extern int ival = 10; // initializer, so it‘s a definition double fica_rate; // no extern, so it‘s a definition
虽然 ival 声明为 extern,但是它有初始化式,代表这条语句是一个定义。类似地,fica_rate 的声明虽然没有初始化式,但也是一个定义,因为没有关键字 extern。同一个程序中有两个以上文件含有上述任一个定义都会导致多重定义链接错误。
对于头文件不应该含有定义这一规则,有三个例外。头文件可以定义类、值在编译时就已知道的 const 对象和 inline 函数,在头文件中定义这些实体,是因为编译器需要它们的定义(不只是声明)来产生代码。例如:为了产生能定义或使用类的对象的代码,编译器需要知道组成该类型的数据成员。同样还需要知道能够在这些对象上执行的操作。类定义提供所需要的信息。在头文件中定义 const 对象则需要更多的解释。
11:C++头文件相关规定
计头文件时,应使其可以多次包含在同一源文件中,这一点很重要。我们必须保证多次包含同一头文件不会引起该头文件定义的类和对象被多次定义。使得头文件安全的通用做法,是使用预处理器定义头文件保护符。头文件保护符用于避免在已经见到头文件的情况下重新处理该头文件的内容。预处理器变量有两种状态:已定义或未定义。定义预处理器变量和检测其状态所用的预处理器指示不同。#define 指示接受一个名字并定义该名字为预处理器变量。#ifndef 指示检测指定的预处理器变量是否未定义。如果预处理器变量未定义,那么跟在其后的所有指示都被处理,直到出现 #endif。
#ifndef SALESITEM_H#define SALESITEM_H// Definition of Sales_item class and related functions goes here#endif
测试 SALESITEM_H 预处理器变量是否未定义。如果 SALESITEM_H 未定义,那么 #ifndef 测试成功,跟在 #ifndef 后面的所有行都被执行,直到发现 #endif。相反,如果 SALESITEM_H 已定义,那么 #ifndef 指示测试为假,该指示和 #endif 指示间的代码都被忽略。