C++ Primer学习笔记与思考_1----变量和基本类型
类型有什么作用?
类型告诉我们数据代表什么意思以及可以对数据执行哪些操作。
一:基本内置类型
C++标准规定了每个算术类型的最小存储空间,但是它并不阻止编译器使用更大的存储空间。对于int,几乎所有的编译器使用的存储空间都比所要求的大。
字符类型有两种char和wchar_t,其中wchar_t用于扩展字符集,比如汉字和日文,这些字符集中的一些字符不能用单个的char表示。
c++ primer第32页
和其他类型不同,char有三种不同的类型:普通char、unsigned char、signed char。虽然char有三种不同的类型,但是只有两种表示方式。可以使用unsigned char或者signed char表示char类型。使用哪种char类型标识方式由编译器决定。
关于这段话的理解:为什么有三种不同的类型,又为什么有两种表示方式?
原来是这样的:在程序中直接写个int , 默认是signed int , 但是在程序中写个char ,就没有默认了,具体是signed char 还是unsigned char ,取决于编译器的设置。
对于vc、x86上的gcc,char被处理成signed char。 如果想测试你的编译器,可以用这段代码
char a =-1;
printf("a=%d",a);
如果结果是 -1,则当前编译器将char 处理成signed char; 如果结果是255,则当前编译器将char处理成unsigned char。
整型的赋值问题
当我们试着把一个超出其取值范围的值赋给一个指定类型的对象时,结果如何?
(1) 对于unsigned类型来说,编译器会对其取模然后得到结果。试图将 336 存储到 8 位的 unsigned char 中,则实际赋值为 80,因为 80 是 336 对 256 求模后的值。此外,负数总是超出unsigned的范围,在c++中把负数赋给unsigned是完全合法的。如果将-1赋给8位的unsigned char,那么结果是255,因为255是-1对256求模后的值。
(2) 当将超过取值范围的值赋给 signed 类型时,由编译器决定实际赋的值。在实际操作中,很多的编译器处理 signed 类型的方式和 unsigned 类型类似。也就是说,赋值时是取该值对该类型取值数目求模后的值。然而我们不能保证编译器都会这样处理 signed 类型。
二:字面值常量
转义字符的一种使用方式:
<span style="color:#330033;"><span style="font-family:SimSun;">#include<iostream> using namespace std; int main() { //输出 Welcome to the "acm" world,必须使用转义字符 cout<<"Welcome to the \"acm\" world"<<endl; return 0; }</span></span>字符串字面值:
<span style="color:#330033;"><span style="font-family:SimSun;">#include<iostream> using namespace std; int main() { cout<<"a multi-line"//正确,类型一致 "string literal" <<endl; // cout<<"multi-line " L"literal"<<endl; //错误,字符串字面值和宽字符串字面值类型不同 cout<<"a mul-line \ using a namespace "<<endl;//多面字符串使用\,此后不得加注释和空格 }</span></span>
三:变量
1.关键字不能是变量名
2.一般用小写字母并且要有助于记忆
3.多个词的标识符在之间加下划线如:student_loan
C++的初始化和赋值是两种不同的操作,这对于内置类型可能没什么区别,但是对于类类型的区别很明显。初始化是指创建变量并给他赋初始值,而赋值则是擦除对象的当前值并用新的值代替。
1) 变量初始化规则
1. 内置类型的变量是否初始化取决于变量定义的位置:在函数体外定义的变量都初始化成0,在函数体内定义的内置类型变量不进行自动初始化。
【但是,未初始化的变量事实上都有一个值】
建议:每个内置类型的对象都要初始化。
2. 类通过定义一个或多个构造函数来控制类对象的初始化。如果一个类有默认构造函数,则无论变量在哪儿定义,默认构造函数都会被调用。
2) 声明和定义
C++通过extern关键字声明,向程序表明变量的类型和名字。因为extern是声明,所以不分配存储空间。
一个变量可以声明多次,但只能定义一次
如果声明有初始化式,那么它可以被当作是定义,即使有声明标记extern,如:
<span style="color:#330033;"><span style="font-family:SimSun;">extern int i;//只声明没有定义 int i; //定义变量 extern double PI = 3.14; //只有当extern声明位于函数外部时,才可以含有初始化式,但是有些编译器还是不能通过编译。 </span></span>3)名字的作用域
c++的作用域可以嵌套,已花括号为界
<span style="color:#330033;"><span style="font-family:SimSun;">//在函数内定义一个与函数可能会用到的全局变量同名的局部变量总是不好的,局部变量最好使用不同的名字! #include <iostream> #include <string> using namespace std; string s1 = "hello"; // s1 has global scope int main() { string s2 = "world"; // s2 has local scope // uses global s1; prints ``hello world'' cout << s1 << " " << s2 << std::endl; //int类型的s1将屏蔽掉std::string类型的s1 int s1 = 42; // s1 is local and hides global s1 // uses local s1; prints ``42 world'' cout << s1 << " " << s2 << std::endl; return 0; } </span></span>英语时刻:Destiny is not a matter of chance .It's a matter of choice.(命运不在于机会,而在于选择。)