Day 7
函数下
1.
完数:该数恰好等于除自身外的因子之和。
2。
集合中没有重复元素。 集合A和集合B的“行知乘”被定义为:A中的每一个元素都与B中的每一个元素相乘,得到的所有乘积构成“行知乘”的结果集合。 例如:A={1,2,3,0};B={4,8,16},则A与B的“行知乘”结果为集合{4,8,16,32,12,24,48,0}。
3.全局变量和局部变量1. 局部变量
- 定义:在函数、循环、条件语句、代码块(如
{}包裹的范围)内部定义的变量,只在这个 “小范围” 内生效。 - 生命周期:从变量定义的位置开始创建,代码块 / 函数执行结束后立即销毁,占用的内存会被释放。
- 作用域:仅限定义它的代码块内部,外部无法访问。
- 存储位置:通常存储在栈(stack) 中。
2. 全局变量
- 定义:在所有函数外部(通常是文件开头)定义的变量,整个程序的所有函数都能访问和修改。
- 生命周期:程序启动时创建,程序结束时才销毁,全程占用内存。
- 作用域:整个程序(如果是多文件工程,需用
extern声明才能跨文件访问)。 - 存储位置:通常存储在全局 / 静态存储区(data segment)。
1. 同名变量的优先级
如果局部变量和全局变量同名,局部变量会覆盖全局变量(仅在局部作用域内):
2. 使用建议(编程最佳实践)
- 尽量少用全局变量:全局变量全程占用内存,容易被多个函数意外修改,导致程序 bug 难以排查;多线程程序中,全局变量还可能引发线程安全问题。
- 优先使用局部变量:局部变量作用域可控,用完即销毁,内存利用率高;若需要在函数间传递数据,优先用函数参数 / 返回值,而非全局变量。
- 特殊场景用全局变量:比如程序全程需要使用的常量(如 π=3.14159)、配置参数等,可定义为const全局变量(只读,避免被修改)。
补充:静态局部变量(特殊的局部变量)
static int cnt = 0; // 静态局部变量:仅初始化一次,生命周期同程序
- 作用域:仅限定义的函数 / 代码块内(局部);
- 生命周期:程序全程(全局);
- 初始化:仅第一次执行到定义行时初始化,后续调用不再初始化。
4.tolower()
tolower 函数是一个标准库函数,用于将一个大写字母转换为对应的小写字母。它在 <cctype> 头文件中定义。
函数原型
int tolower(int ch);
- 参数
ch: 要转换的字符。虽然参数类型是int,但它实际上接收的是一个字符(如'A')。这里的int类型是为了能够处理一个特殊值EOF(End Of File),其值通常是-1。在传入字符时,它会被提升为int类型。 - 返回值:如果 ch 是一个大写字母('A' 到 'Z'),则返回其对应的小写字母('a' 到 'z')的 int 值(若要输出字母要用强类型转换)如果 ch 不是一个大写字母,则直接返回 ch 的原始 int 值。
强制转换static_cast<char>(tolower(ch));
处理 unsigned char: 在某些系统或字符集下,如果 char 类型是有符号的,并且字符值大于 127(ASCII码),直接传递给 tolower 可能会导致未定义行为。为了代码的健壮性,推荐的做法是先将 char 转换为 unsigned char。
