第2章 基本编程语句
1.声明与定义:
(1)声明语句只声明名称,未分配存储空间。定义则为名称分配空间。可以声明多次,但只能定义一次。
(2)int a = 3; //有初始化的定义
int a; a = 3;//定义后赋值,与上面效果相同。
2.if语句条件中定义的变量只能在整个if语句范围内使用:
if(int a = b) cout << a << endl; //将b赋给a,若b不为 0 则输出a;
a ++; //编译出错:a无定义,a只在if语句范围内使用
3.条件表达式:(x?a:b) = 32;之中a和b必须为相同的数据类型。如不同则只能用if语句:if(x) a = 32;else b = 32;
4.(1)Switch括号中的表达式只能对整型、字符型或枚举型即整数或整数的子集进行测试,不能测试范围或浮点值。
(2)每个case常量表达式的值必须互不相同:case 'A':a++;case 65:a++;//编译出错,因为A的ascii码为65。
(3)case语句只起语句标号作用,case和default并不改变控制流程,与break联用才能保证多路分支的正确实现。
(4)Case语句顺序可任意。
(5)Switch语句可嵌套即case中还可以包含switch语句。
5.循环:
(1)for循环将循环变量和初始化放在循环外部去描述,可以使循环变量在循环结束后仍然存在。
int n = 1;
for(;n*n - 6*n - 13 <= 0;++n);
cout << n << endl;
(2)While循环式for循环的特例:for(;i < 100; )=> while(i < 100)
(3)有些循环不能确定循环次数,此时可以利用while循环表示成一种无条件判断的无限循环形式。eg:int n = 1;
While(1) //也可作:for(;;)
if(n*n -6*n-13>0) break; else ++n; cout << n <<endl;
(4)continue结束本次循环,break终止整个循环。
(5)Goto语句可以方便的跳出深循环,使用try/catch捕获异常也可以。
(6)For循环比while好的地方在于循环条件者中的局部变量可以不必公开化,而且for循环体简单易读。
6.流状态
cout << showpos << 12 <<endl; //showpos:0和正数前显示+
cout << hex << 18 << " " << showbase << 18 <<endl; //hex十六进制显示整数,showbase:十六制前加OX,八进制前加:O
cout << oct << 9 <<endl;//oct:八进制显示整数,dec:十进制显示整数
cout << hex << 255 << " " << uppercase << 255 <<endl;//uppercase:十六进制格式字母用大写字母表示(默认为小写)
cout << 123.0 << " " << showpoint << 123.0 <<endl;//showpoint:浮点数输出即使小数点后为0也输出小数点
cout << (2 > 3) << " " <<boolalpha<<(2<3)<<endl; //boolalpha:逻辑值1/0,用ture/false表示
cout << fixed << 12345.678 <<endl;//fixed:定点数格式输出
cout << scientific << 12345.678 <<endl;//scientific:科学记数法输出
cout.unsetf(ios::scientific);//cout捆绑函数调用来取消显示格式
cout.unsetf(ios::showpos);
cout << 12345.678 <<endl;
cout << showpos << 12345.678 <<endl;
cout << noshowpos << 12345.678 <<endl;//取消流状态:noshowpos,noshowbase,nouppercase,noshowpoint,noboolalpha
cout.unsetf(ios::hex);
cout.width(5);//设置显示宽度
cout.fill('*');//设置填充字符
cout << 123 << 23 <<endl;//width(n)为一次性操作
cout.width(5);
cout.fill('$');
cout << left << 23 << endl;//left:左对齐,填充字符在右边,默认在左边
cout.precision(7); //precision:设置有效位数(总位数,普通显示方式)或精度(小数点后的位数,定点或科学记数法)
cout << 1234.5 <<endl;
cout << fixed << 1234.5 <<endl;
cout << scientific << 1234.5 <<endl;
cout.unsetf(ios::scientific);
cout.precision(6); //默认输出有效位数为6位
cout << 1234.5 <<endl;
cout << right << setw(5) <<setfill('*') << 23 <<endl;//setw(int),设置宽度,setfill(char):设置填充字符
cout << setprecision(7) <<1234.5 <<endl;
cout.precision(6);
cout << 1234.5 <<endl;
7.用输入输出文件流打开文件:
ifstream fin(filename,openmode = ios::in);
ofstream fout(filename,openmode = ios::out);
Ifstream,ofstream 是类型名,表示输入输出文件流,fin、fout是文件流的名称,filename是打开的外部文件名,openmode 是打开方式,ifstream默认打开方式为ios::in,ofstream默认打开方式为ios::out,故在打开已经存在的输入文件和新建一 个输出文件时可以省略这个参数。
输入输出操作大多能返回操作状态(true/false),故常将读入操作放在循环的条件判断上。
#include<sstream>
#include<fstream>
using namespace std;
//--------------------------------
int main()
{
ifstream in("a.txt");
ofstream out("b.txt");
for(string str;getline(in,str);)
out<<str<< endl;
return 0;
}
Getline(in,str)从输入流in中整行读入到str中,文件中的换行符被丢掉了,在out上输出str时要补上一个回车。