“最近重温C++的基础知识,意识到初次学习时遗漏的一些知识点,记录下来,方便日后工作学习。”
下面正文开始:
一、输入输出控制符
在printf和scanf中可以使用以"%”开头的控制符,指明要输入或输出的数据的类型以及格式。
1.1 输出double类型变量的格式控制符是%lf,%f代表float。
1.2 cin/scanf,cout/printf区别
cin,cout速度比scanf.printf慢,输入输出数据量大时用后者;
一个程序里面不要同时用cin和scanf,不要同时用cout和printf
1.3 EOF是什么?
EOF是直接能拿来用的符号常量,若scanf(...)值为EOF(即-1)则说明输入数据已经结束;
如何在不想继续输入参数时停止输入,直接结束程序?
在Windows系统下,Ctrl+Z然后回车,程序结束。
1.4 freopen
调试程序时,每次运行程序都要输入测试数据,太麻烦。可以将测试数据存入文件,然后用freopen将输入由键盘重定向为文件,则运行程序时不再需要输入数据了。
freopen("test.txt","r",stdin); //此后所有输入都来自文件test.txt
二、数组
2.1 计算数组的占用多少字节的存储空间
T a[N];//T为类型名,如char,double,int等。N为正整数或值为正整数的常量表达式。
数组a有N个元素,每个元素都是一个类型为T的变量。N个元素在内存里是一个挨一个连续存放的。a数组占用大小总共为N×sizeof(T)字节的存储空间。表达式sizeof(a)的值就是整个数组的体积,即N×sizeof(T)。
2.2 数组越界
数组元素的下标,可以是任何整数,可以是负数,也可以大于数组的元素个数。用变量作为数组下标时,可能会导致数组越界(变量下标值变为负数,或者太大)。
数组越界可能造成——1.引起意外修改其他变量的值,导致程序运行结果不正确;2.试图访问不该访问的内存区域,导致程序崩渍。
此外,数组越界的程序,用某些编译器编译后可能可以正确运行,换一个编译器编译后就运行错误。
2.3 二维数组作为函数的参数
二维数组作为形参时,必须写明数组有多少列,不用写明有多少行。理由如下:
形参数组的首地址就是实参数组的首地址,必须要写明列数,编译器才能根据下标算出元素的地址。
如a[i][j]的地址:数组首地址+i × N x sizeof(a[0][0])+j × sizeof(a[0][0])(N是数组列数)。
三、数学函数
数学库函数声明在cmath中,主要有:
int abs(int x) //求整型数x的绝对值
double cos(double x) //求x(弧度)的余弦
double fabs(double x) //求浮点数x的绝对值
int ceil(double x) //求不小于x的最小整数
double sin(doublex) //求x(弧度)的正弦
double sqrt(double x) //求x的平方根
四、字符处理函数
这些库函数在ctype中声明,主要有:
int isdigit(int c) //判断c是否是数字字符
int isalpha(int c) //判断c是否是一个字母
int isalnum(int c) //判断c是否是一个数字或字母
int islower(int c) //判断c是否是一个小写字母
int islower(int c) //判断c是否是一个小写字母
int isupper(int c) //判断c是否是一个大写字母
int toupper(int c) //如果c是一个小写字母,则返回对应大写字母
int tolower(int c) //如果c是一个大写字母,则返回对应小写字母
五、逻辑运算、位运算
5.1 按位异或 " ^ "
按位异或运算通常用未将某变量中的某些位取反,且保留其他位不变。
例如,如果需要将int型变量n的低8位取反,而其余位不变,则可以执行:
n ^=Oxff ;
异或运算的特点是:如果a^b=c,那么就有c^b=a以及c^a=b。(穷举法可证),此规律可以用来进行最简单的加密和解密。
另外异或运算还能实现不通过临时变量,就能交换两个变量的值:
int a=5,
b=7;
a=a^b;
b=b^a;
a=a^b;
即实现a,b值交换。(这个是不是有点神奇?)
5.2 左移运算符 “ << ”
实际上,左移1位,就等于是乘以2,左移n位,就等于是乘以。
而且(敲黑板!)左移操作比乘法操作快得多。
5.3 右移运算符 “ >> ”
表达式:a>>b的值是:将a各二进位全部右移b位后得到的值。右移时,移出最右边的位就被丢弃。a的值不因运算而改变。
对于有符号数,如long,int,short,char类型变量,在右移时,符号位(即最高位)将一起移动,并且大多数C/C++编译器规定,如果原符号位为1,则右移时高位就补充1,原符号位为0,则右移时高位就补充。
实际上,右移n位,就相当于左操作数除以,并且将结果往小里取整。
-25>> 4=-2 ;
-2>> 4=-1 ;
18>> 4= 1 ;