/* 第二章 数据 变量和计算 2.1 C++程序结构 2.1.1 程序注释 2.1.2 #include 指令---头文件 2.1.3 命名空间和using声明 2.1.4 main()函数 2.1.5 程序语句 2.1.6 空白 2.1.7 语句块 2.1.8 自动生成的控制台程序 2.2 定义变量 2.2.1 命名变量 2.2.2 声明变量 2.2.3 变量的初始值 //变量写入初值还有另外一种方法,称作函数表示法, //int val(0); //int count(10); 2.3 基本数据类型 //其基本的类型分为3类,即存储整数的类型,存储非整数值的类型--它们称为浮点类型,以及指定空的值集或者不指定任何类型的void类型 2.3.1 整型变量 short feetPerPerson=2; short int feetPerPerson=2; 表示是一样的,short是短整型变量,二个字节 long bigNumber(1000000L); 长整型变量,四个字节 2.3.2 字符数据类型 可以存储在char型变量中的整数的值域是从-128~127 一个字节长度 wchar_t宽字符类型 值域为0~65535 2.3.3 整型修饰符 默认情况下,char int short或long将存储有符号的整数值 signed unsigned 无符号说明,无符号数不能表示负数,最小表示数为0,但他表示的整数比有符号的要多一位 2.3.4 布尔类型 //注意: TRUE和FALSE 写成大写字母,不是C++中的关键字,它们只是在MFC内部定义的符号,还要注意,TRUE和FALSE不是合法的bool值 //所以不能混淆true和TRUE 2.3.5 浮点类型 double in_to_mm = 25.4; 8个字节位置 float pi = 3.14159f; 占用4个字符位置 ISO/ANSI C++中的基本类型 bool 1 trua或者false char 1 -128~+127 signed char 1 -128~+127 unsigned char 1 0~255 wchar_t 2 0-65525 short 2 -32768~+32768 unsigned short 2 0~65525 int 4 -2147483648~+2147483648 usinged int 4 0~4294967295 long 4 -2147483648~+2147483648 unsigned long 4 0~4294967295 float 4 double 8 long double 8 2.3.6 字面值 2.3.7 定义数据类型的同义词 typedef关键字能够使您为现有的类型定义自己的类型名称 typedef long int BigOnes; BigOnes mynum = 100; 2.3.8 具有特定值集的变量 有时需要一些具有一个有限的可能值集的变量,标记有效地引用这些值,C++中有一种处理这种情况的工具,称之为枚举 enum Week{Mon, Tues, Wed, Thurs, Fri, Sta, Sun} thisWeek; 日期的每个名称都被定义表示一个固定的整数值,这个表中的第一个名称Mon具有值0,Tues是1,依此类推 thisWeek = Week::Tues; 这样thisWeek的值为1 也可以这样编写下列语句 enum Week{Mon=1, Tues, Wed, Thurs, Fri, Sta, Sun} thisWeek; 那么上面的thisWeek的值就为2 2.4 基本的输入/输出操作 2.4.1 从键盘输入 2.4.2 到命令行的输出 2.4.3 格式化输出 2.4.4 转义序列 转义序列 作用 \a 发出蜂鸣声 \n 换行 \' 单引号 \\ 反斜杠 \b 退格 \t 制表符 \" 双引号 \? 问号 2.5 C++中的计算 2.5.1 赋值语句 了解lvalue和rvalue lvalue是一种涉及内存地址的变量,之所以这样称呼它,是因为所有产生lvalue的表达式都可以出现在赋值语句中等号的左边。大多数变量都lvalue,因为它们指定内存中的一个位置,但是,由于一些变量的值已经被定义为常量,所以它们不是lvaue 2.5.2 算术运算 1 const修饰符 2 常量表达式 3 程序输入 4 计算结果 5 显示结果 2.5.3 计算余数 % 2.5.4 修改变量 2.5.5 增量和减量运算符 2.5.6 计算的顺序 2.6 变量类型和类型强制转换 2.6.2 赋值语句中的类型强制转换 int num = 0; float decimal = 2.5f; number = decimal; 注意变量2.5f末尾的字母亲f,它告诉编译器这个常量是单精度浮点型,如果没有f,默认的类型将是double,任何包含小数点的常量都是浮点型,如果不希望它成为双精度浮点型,那么就需要附加字母f,大写字母F具有相同的作用 2.6.3 显式类型强制转换 static_cast<the_type_to_convert_to>(expression) dynamic_cast将对转换进行动态检查,也就是说,在执行程序时进行检查 const_cast用于删除表达式中的const属性 reinterpret_cast是一种无条件的强制转换 2.6.4 老式的类型强制转换 (要转换成的类型)表达式 strips_per_rool = (int)(rolllength/height); 2.6.5 按位运算符 & 按位与(AND) | 按位或(OR) ^ 按位异或(EOR) ~取反(NOT) >>右移 <<左移 1 AND运算符 2 OR运算符 3 EOR运算符 4 NOT运算符 5 移位运算符 //向左移动n位相当于这个值和2相乖n次,换句话说,相当于以2n,类似地,向右移动n位相当于除以2n 2.7 了解存储时间和作用域 变量的生存期和作用域是两个不同的概念,重要的是不要混淆两个概念, 生存期是执行过程中的一个期间,从创建这个变量时开始,到销毁这个变量并且释放共占用的内存空间结束 变量的作用域是可以在其中访问这个变量的程序代码区域 2.7.2 决定变量声明的位置 2.7.3 全局变量 2.7.4 静态变量 static int count; 如果在声明一个静态变量时没有给它提供初始值,那么程序将对它进行初始值 静态变量的默认初始值始终为0 2.8 命名空间 using namespace std; 2.8.1 声明命名空间 namespace myStuff { //.... } 2.8.2 多个命名空间 2.9 C++/CLI编程 C++/CLI功能包括 在C++/CLI程序中,前面讨论的所有ISO/ANSI基本数据类型都可以使用,但是在某些上下文中,它们具有一些额外的属性 在控制台程序中,C++/CLI对键盘输入和命令行输出提供了它自己的机制 C++/CLI引入了safe_cast运算符,确保类型强制转换操作能够了生成可检验的代码 C++/CLI提供了另外一种基于类的枚举功能,它的灵活性超过了前面所介绍的ISO/ANSIC++enum声明 2.9.1 C++/CLI特有的基本数据类型 long long 8个字节 unsigned long long 8个字节 基本类型 大小姐 CLI值类 bool 1 System::Bollean char 1 System::SByte signed char 1 System::SByte unsigned char 1 System::Byte short 2 System::Int16 unsigned short 2 System::UInt16 int 4 System::Int32 unsigned int 4 System::UInt32 long 4 System::Int32 unsigned long 4 System::UInt32 long long 8 System::Int64 unsigned long long 8 System::UInt64 float 4 System::Signle double 8 System::Double long duble 8 System::Double wchat_t 2 System::Char 2.9.3 C++/CLI特有的功能--格式化输出 int packageCount = 25; Console::WriteLine(L"There are {0} packages.", packageCount) 格式说明符 C或c 把值作为货币输出 D或d 把整数作为十进制值输出,如果指定的精度大于位数,那么将在数字的左边填充0 E或e 按照科学记数法输出浮点值,即利用指数,精度值表示在小数点后输出的位数 F或f 把浮点值作为开式为+dddd.dd.....的定点输出 G或g 以最紧湊的形式输出值,这取决于值的类型和是否指定了精度,如果没有指定精度,那么将使用默认的精度 N或n 把值作为定点十进制值输出,必要时,将以每3位为一组用逗号分隔开 X或x 把整数为十六进制值输出,根据是否指定x或x,将输出十六进制数字的大写或小写形式 2.9.4 C++/CLI的键盘输入 Console::Read() Console::ReadLine(); Console::ReadKey() String^ line = Console::ReadLine(); 类型名称String后面的字符^表示这是引用String类型对像的句柄, char ch = Console::Read(); ConsoleKeyInfo keyPress = Console::ReadKey(true); true导致按皱键不在命行上显示 2.9.5 使用safe_cast safe_cast 等于于static_cast 2.9.6 C++/CLI枚举 C++/CLI程序中的枚举和ISO/ANSI C++程序有很大的不同,首先在C++/CLI中定义一个枚举 enum class Suit{Clubs, Diamonds, Hearts, Spades} Suit suit = Suit::Clubs; 1 指定枚举常量的类型 short unsigned short int unsigned int long unsigned long long long unsigned long long signed char unsigned char char bool 2 指定枚举常量的值 enum class Face : char{ Ace = 1, Two,Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King}; 3 枚举常量运算 4 使用枚举器作为标识位 */ //练习题一: /*#include <iostream> using std::cout; using std::endl; int main() { int age; cout<<"请输入你的年龄:"<<endl; std::cin>>age; cout<<age<<endl; return 0; }*/ //练习题二 /*#include <iostream> using std::cout; using std::endl; int main() { int age; cout<<"请输入数值:"<<endl; std::cin>>age; int s = age / 8; int v = age - (s*8); cout<<"数值"<<age<<"与8的正余数为:"<<v<<endl; return 0; }*/ //第三题 /*#include <iostream> using std::cout; using std::endl; int main() { int s = (1 + 2) + (3 + 4); cout<<"s:"<<s<<endl; s = (16*4) / (2*3); cout<<"s:"<<s<<endl; int a=1, b=2, c=3, d = 4, e = 5, f=6; s = (a > b) ? a : ((c> d) ? e : f);//6 cout<<"s:"<<s<<endl; return 0; }*/ //第四题 /*#include <iostream> using std::cout; using std::endl; int GreatestCommonDivisor ( int m, int n ) { //m1280 n:1028 int r; do { r = m % n; // 1280 % 1028 = 252 cout<<"r:"<<r<<endl; m = n; n = r; // m:1028 n:252 // m:20 n:252 }while ( r != 0 ); return m; } int main() { int width = 1280; int height = 1028; //double aspect = width / height; double aspect = static_cast<double>(width) / height; cout<<"aspect:"<<aspect<<endl; //int ans = GreatestCommonDivisor(width,height); //cout<<"ans:"<<ans<<endl; return 0; }*/ //第五题 /*#include <iostream> using std::cout; using std::endl; int main() { unsigned s = 555; cout<<"sizeof(s):"<<sizeof(s)<<endl; int v = (s >> 4); // 34 cout<<"v:"<<v<<endl; v = (~0<<3); //-8 cout<<"(~0<<3):"<<v<<endl; //cout<<"~0:"<<~0<<endl; cout<<"~(~0<<3):"<<~(~0<<3)<<endl; int vv= 34 & 7; cout<<"34&7:"<<vv<<endl; //12 int i = (s >> 4) & ~(~0<<3); cout<<"i:"<<i<<endl; int m = 1; int n = (m++) + (m++); cout<<"n:"<<n<<endl; return 0; }*/ /* #include <iostream> using namespace std; int main() { char packet[10]; //cout<<"packet[0]:"<<packet[0]<<endl; *(packet + 1) = '2'; for (int i = 0;i<sizeof(packet); ++i) { //cout<< *(packet + i)<<endl; //cout<<"i:"<<packet[i]<<endl; cout<<"i:"<<*(packet+i)<<endl; } return 0; }*/ //第五题 /*#include <iostream> using std::cout; using std::endl; int main() { unsigned s = 555; cout<<"sizeof(s):"<<sizeof(s)<<endl; cout<<"(s>>4):"<<(s>>4)<<endl; //这里是如何转过去,还需要多学习,加强加强 //0000 0000 0000 0000 0000 0000 0100 0010 //cout<<"(~0 << 3):"<<(~0 << 3)<<endl; //这里没弄懂,-0 << 8 这句好像不能理解 //~0 是指把所有位都反转过来 // 0的32位 0000 0000 0000 0000 0000 0000 0000 0000 // 反转后的32位 1111 1111 1111 1111 1111 1111 1111 1111 //然后进行<<3位的操作, //右移三位的操作数为: 1111 1111 1111 1111 1111 1111 1111 1000 //然后进行~操作,也就是反转操作 //0000 0000 0000 0000 0000 0000 0000 0111 //然后将(s>>4)与后面的进行与操作 //值1: 0000 0000 0000 0000 0000 0000 0100 0010 //值2: 0000 0000 0000 0000 0000 0000 0000 0111 //值3: 0000 0000 0000 0000 0000 0000 0000 0010 return 0; }*/