一、转义字符
转义字符是C语言中用于表示特殊字符的符号组合,通常以反斜杠 \
开头。它们可以控制输出格式或表示一些无法直接输入的字符。
常见转义字符与功能
转义字符 | 描述 | 效果 |
---|---|---|
\n | 换行符 | 将输出移动到下一行 |
\t | 制表符 | 输出水平制表符 |
\b | 回退符 | 光标回退一格 |
\r | 回车符 | 将光标移至行首 |
\' | 单引号 | 输出单引号字符 |
\" | 双引号 | 输出双引号字符 |
\\ | 反斜杠 | 输出反斜杠 |
示例代码与效果
示例 1
#include <stdio.h>
int main() {
printf("abc\\tij#k\\n\n");
printf("abc\tij#k\n");
return 0;
}
输出结果:
abc\tij#k\n
abc ij#k
示例 2
#include <stdio.h>
int main() {
printf("ab*c\\t*de\\rf\\tg\\n\n");
printf("fb*c\tgde\n");
return 0;
}
输出结果:
ab*c\t*de\rf\tg\n
fb*c gde
转义字符在控制输出格式时非常重要,尤其是在多行、多列的输出中。
二、数据类型与存储
1. 常量与变量
- 常量:值在程序运行期间不能被修改。例如:
const int a = 10; // 定义一个整数常量
- 变量:值可以在程序运行期间发生变化。例如:
int b = 20; // 定义一个整数变量
2. 数据类型的表示形式
字符常量可以有多种表示方式:
表示形式 | 示例 |
---|---|
字符 | 'A' |
八进制 | '\101' |
十六进制 | '\x41' |
十进制 | 65 |
以上所有形式都表示字符 'A'
。
三、运算符详解
1. 算术运算符
运算符 | 描述 | 示例 |
---|---|---|
+ | 加法 | a + b |
- | 减法 | a - b |
* | 乘法 | a * b |
/ | 除法 | a / b |
% | 取余(求模) | a % b |
注意:
- 整数除法:两个整数相除时,结果为整数,余数会被舍弃。
- 取余运算:只能用于整数,且结果的符号与左操作数一致。
示例代码
#include <stdio.h>
int main() {
int a = 10, b = 3;
printf("a / b = %d\n", a / b); // 整数除法
printf("a %% b = %d\n", a % b); // 取余运算
return 0;
}
输出结果:
a / b = 3
a % b = 1
2. 自增与自减运算符
运算符 | 描述 | 示例 |
---|---|---|
++ | 自增(加1) | ++a 或 a++ |
-- | 自减(减1) | --a 或 a-- |
注意:
a++
:后置自增,先返回原值,再执行加1操作。++a
:前置自增,先执行加1操作,再返回值。
示例代码
#include <stdio.h>
int main() {
int a = 5;
printf("a++ = %d\n", a++); // 输出 5,然后 a 变为 6
printf("++a = %d\n", ++a); // 先加1,再输出 7
return 0;
}
输出结果:
a++ = 5
++a = 7
运算规则:
- 单独使用时,没区别;参与到别的运算中时,此时运算规则发挥作用。
- 运算数必须是个左值
3. 复合赋值运算符
运算符 | 描述 | 示例 |
---|---|---|
+= | 加后赋值 | a += 1 等价于 a = a + 1 |
-= | 减后赋值 | a -= 1 等价于 a = a - 1 |
/= | 除后赋值 | a /= 1 等价于 a = a / 1 |
四、随机数相关函数的用法
1. rand()
函数
- 功能: 用于生成伪随机数。
- 头文件: 需要包含
<stdlib.h>
。 - 函数原型:
int rand(void);
- 返回值: 就是产生随机数的值。
- 特点:
- 生成的随机数是伪随机数,基于一个递推公式计算得出。
- 如果需要生成一定范围内的随机数,可以使用取余操作。例如,
rand() % N
生成[0, N-1]
范围内的随机数。
2. srand()
函数
- 功能: 用于设置随机数种子,影响
rand()
的生成序列。 - 头文件: 需要包含
<stdlib.h>
。 - 函数原型:
void srand(unsigned int seed);
- 参数:
seed
: 设置的种子值。
- 返回值: 无返回值(
void
)。 - 特点:
- 如果不调用
srand()
,默认种子值为1
,每次运行程序生成的随机数序列相同。 - 为了生成不同的随机数序列,可以使用当前时间作为种子值(见下文
time()
函数)。
- 如果不调用
3. time()
函数
- 功能: 获取当前时间的秒数,用于动态设置随机数种子。
- 头文件: 需要包含
<time.h>
。 - 函数原型:
time_t time(time_t *tloc);
- 参数:
tloc
: 指针参数,通常传入NULL
。
- 返回值: 返回从 1970 年 1 月 1 日 00:00:00 UTC 到当前时间的秒数。
- 用途: 常用于动态设置随机数种子,例如:
srand(time(NULL));
4. 伪随机数的特点
- 伪随机性: 计算机生成的随机数并非真正随机,而是基于种子值和递推公式生成的伪随机数。
- 种子影响: 相同的种子值会生成相同的随机数序列,因此通过动态种子(如时间)可以提高随机性。
5. 示例代码
以下代码展示了如何生成 [0, N-1]
范围内的随机数:
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
int main() {
int N = 10; // 随机数范围 [0, N-1]
srand(time(NULL)); // 设置随机数种子
for (int i = 0; i < 5; i++) {
printf("%d\n", rand() % N); // 生成随机数
}
return 0;
}
- 使用
rand()
生成随机数,结合srand()
设置种子值。 - 动态种子值可以通过
time(NULL)
获取当前时间。 - 伪随机数的范围可以通过取余操作调整。
五、贪心原则与表达式
贪心原则是C语言解析运算符的重要规则:从左到右扫描字符,尽可能多地结合成合法的C语言运算符。这种解析方式在复杂表达式中尤为重要,尤其是涉及自增、自减等运算符时。
示例代码
#include <stdio.h>
int main() {
int i = 5;
int result = i++ + i; // 按贪心原则解析
printf("Result: %d\n", result);
return 0;
}
解析过程:
- 按贪心原则,
i++ + i
被解析为(i++) + i
。 i++
是后置自增,先返回i
的当前值(5),然后i
自增为 6。- 第二个
i
的值为 6。 - 最终结果为
5 + 6 = 11
。
输出结果:
Result: 11
更复杂的示例
#include <stdio.h>
int main() {
int i = 5;
int result = i+++++i; // 按贪心原则解析
printf("Result: %d\n", result);
return 0;
}
解析过程:
- 按贪心原则,
i+++++i
被解析为((i++)++) + i
。 - 由于
(i++)++
是非法的(i++
的结果是一个右值,不能再进行自增操作),编译器会报错。
注意:
- 在函数参数中,避免对同一个变量连续多次使用
++
或--
,否则可能导致不可预期的结果。
六、隐式类型转换
在C语言中,隐式类型转换是指在表达式中,不同类型的操作数会根据一定规则自动转换为同一类型,以保证运算的正确性。
转换规则
-
从低精度到高精度:
- 当不同精度的类型混合运算时,低精度类型会自动转换为高精度类型。
- 转换顺序:
double
←float
↑
long
↑
unsigned
↑
int
←char
,short
-
从右向左必转:
- 在赋值运算中,右侧的值会被转换为左侧变量的类型。
-
从高精度到低精度:
- 如果高精度类型赋值给低精度类型,可能会发生精度丢失或数据截断。
示例代码
#include <stdio.h>
int main() {
int a = 10;
char b = 'a'; // ASCII值为97
float c = 1.5;
double d = 8765.1234;
double result = a + b + c - d * b; // 隐式类型转换
printf("Result: %lf\n", result);
return 0;
}
解析过程:
a + b
:b
(char
)被提升为int
,结果为10 + 97 = 107
。107 + c
:c
(float
)被提升为double
,结果为107.0 + 1.5 = 108.5
。d * b
:b
(char
)被提升为double
,结果为8765.1234 * 97.0 = 849420.2998
。108.5 - 849420.2998
:结果为-849311.7998
。
输出结果:
Result: -849311.799800