碎片知识总结_刷题篇
1. (int / int) 以及 (float / int)
int / int 结果仍然是 int ,float / int 结果才是 float
来看一段样例程序
1 #include <iostream> 2 using namespace std; 3 4 int main() { 5 cout << 3 / 2 << endl; 6 cout << 3.0 / 2 << endl; 7 8 return 0; 9 }
结果如下
1 1.5
另外需要注意就是,当出现以下情况——存在两个int类型的a和b,需要求a / b 的结果,然而结果可能存在不是整数的情况下,可以使用 1.0 * a / b 的方式获得浮点数类型的结果。
2. printf 输出格式控制符
函数原型: int printf (const char *format, [ argument ]);
其中,format 是参数的输出控制符,定义格式: %[ flags ] [ width ] [ .perc ] [ F | N | h | l ] type
format 中各个参数规定细节如下:
type:
整数
%d | 整数的参数会被转化为一个有符号的十进制数字 |
%u | 整数的参数会被转化为一个无符号的十进制数字 |
%o | 整数的参数会被转化为一个无符号的八进制数字 |
%x | 整数的参数会被转化为一个无符号的十六进制数字,并以小写abcdef表示 |
%X | 整数的参数会被转化为一个无符号的十六进制数字,并以大写ABCDEF表示 |
浮点数
%f | 单精度浮点型,对应float类型的参数 |
%lf | 双精度浮点型,对应double类型的参数 |
%e |
double 类型的参数以指数形式打印,整数一位小数六位,指数部分以小写e表示 |
%E | double 类型的参数以指数形式打印,整数一位小数六位,指数部分以大写E表示 |
字符与字符串
%c | 字符控制符 |
%s | 字符串控制符,字符串逐字输出,直到遇到 ' \0 ' 为止 |
flags ( 用以规定输出格式 ):
默认 | 右对齐,在某些情况下左侧填充0或空格 |
- | 左对齐,在某些情况下右侧填充0或空格 |
+ | 无论正负,强制在增加+或-号 |
# | type = o, x, X,分别在数值前增加'0',"0x","0X";type = e, E, f,总是使用小数点 |
width ( 用以控制显示数值的宽度 ):
n | 宽度至少为n位,不够以空格填充 |
0n | 宽度至少为n位,不够以0填充 |
.perc ( 用以控制小数点后的位数 ):
参数为n,格式为 .n ,一般用于实型小数点保留位数,并按照四舍五入原则;
F | N | h | l ( 用以表示指针是否是远指针或整数是否是长整数 ):
F | 远指针 |
N | 近指针 |
h | 短整数或单精度浮点数 |
l | 长整数或双精度浮点数 |
3. string 的按位赋值操作
对于 string 类型的字符串,按位赋值操作不能使用类似于 char 的 str[ i ] = c 这一类赋值方式,而是要使用 " += " 算符实现该操作,类似于 vector 中的 push_back 方法,只能在末尾插入新的元素;
具体操作如下:
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 int main() { 6 string str; 7 for (int i = 0; i < 10; i++) 8 str += '0'; //赋值时一定注意格式是str,而不是str[i] 9 cout << str.size() << endl; 10 cout << str << endl; 11 12 return 0; 13 }
结果如下:
10 0000000000
4. 函数的形参实参与参数返回
形参:定义函数名和函数体时需要用的参数,目的是用来接收调用该函数时传递的参数;
实参:存在于主调函数中,传递给被调函数相应的值;
形参和实参的功能是作数据传送;发生函数调用时, 主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送;同时函数调用中发生的数据传送是单向的,即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参,因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。
形式参数 | 实际参数 | |
区别1 | 只能是变量,在被定义的函数中,必须指定形参的类型 | 常量、变量、表达式、函数等 |
区别2 | 无确定的值 | 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参 |
区别3 | 形参变量在未出现函数调用时,并不占用内存,只在调用时才占用。调用结束后,将释放内存 | 开辟内存存储数据 |
关联 | 形参和实参的类型应相同或赋值兼容 |
如果希望函数调用结束后保留并使用形参的值,一般有一下几种方式:
1. 返回值;在函数调用结束后使用函数返回值传回形参的值;
2. 引用;使用引用方式传参,使得函数中操作的数据就是实参本身;
3. 指针;传递指向实参的指针,使函数直接操作实参,类似于引用传递方式;
4. 全局变量;
注意:如果一个函数的功能是给某一数组排序,那么就不能使用引用的方式直接传递数组名从而达到参数回传的效果,因为引用是针对于一个变量的别名,它指向这个变量的内存地址,但是一个数组中存在很多变量,因此不能用一个引用标识整个数组,否则程序会出现错误甚至崩溃。
5. C++ 中基本数据类型的取值范围
数据类型 | 字节数 | 取值范围 |
void | 0 | NULL |
bool | 1 | true false (0或1) |
char | 1 | -2^7 ~ 2^7-1 (-128 ~ 127) |
unsigned char | 1 | 0 ~ 2^8-1 (0 ~ 255) |
int | 4 | -2^31 ~ 2^31-1 (-2147483648 , +2147483647) 约为 -2*10^10 ~ 2*10^10 |
unsigned int | 4 | 0 ~ 2^31-1 (0 , +2147483647) |
short | 2 | -2^15 ~ 2^15-1 (-32767 ~ +32768) 约为 -3*10^5 ~ 3*10^5 |
unsigned short | 2 | 0 ~ 2^15-1 (0 ~ +32768) |
long | 4 | (同int) -2^31 ~ 2^31-1 (-2147483648 , +2147483647) 约为 -2*10^10 ~ 2*10^10 |
unsigned long | 4 | (同unsigned long) 0 ~ 2^31-1 (0 , +2147483647) |
long long | 8 | -2^63 ~ 2^63-1 (-9223372036854775808 ~ +9223372036854775807) 约为 -9*10^19 ~ 9*10^19 |
unsigned long long | 8 | 0 ~ 2^63-1 (0 ~ +9223372036854775807) |
float | 4 | +/- 3.40282e+038 约为 +/- 3.4*10^38 |
double | 8 | +/- 1.79769e+308 约为 +/- 1.7*10^308 |
6. 对数串或字符串的连续字符操作
1. for 循环遍历串中的元素,并事先根据题意定义相关统计变量;
2. 在第一层遍历循环中嵌套一层 while 循环,循环条件是当前访问元素是否等于下一个将要访问的元素、题设中的某些条件;
3. 若等于,则进入循环,统计变量根据题设条件改变,第一层的 for 循环变量 (比方说是 i) 自增1;
4. 若不等于,则根据题设条件进行其他操作;
具体的应用样例及代码示例可以看之前的博文