C语言学习:运算符和表达式

一、转义字符

转义字符是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

注意:

  1. 整数除法:两个整数相除时,结果为整数,余数会被舍弃。
  2. 取余运算:只能用于整数,且结果的符号与左操作数一致。
示例代码
#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)++aa++
--自减(减1)--aa--

注意:

  • 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;
}

解析过程:

  1. 按贪心原则,i++ + i 被解析为 (i++) + i
  2. i++ 是后置自增,先返回 i 的当前值(5),然后 i 自增为 6。
  3. 第二个 i 的值为 6。
  4. 最终结果为 5 + 6 = 11

输出结果:

Result: 11

更复杂的示例

#include <stdio.h>

int main() {
    int i = 5;
    int result = i+++++i; // 按贪心原则解析
    printf("Result: %d\n", result);
    return 0;
}

解析过程:

  1. 按贪心原则,i+++++i 被解析为 ((i++)++) + i
  2. 由于 (i++)++ 是非法的(i++ 的结果是一个右值,不能再进行自增操作),编译器会报错。

注意:

  • 在函数参数中,避免对同一个变量连续多次使用 ++--,否则可能导致不可预期的结果。

六、隐式类型转换

在C语言中,隐式类型转换是指在表达式中,不同类型的操作数会根据一定规则自动转换为同一类型,以保证运算的正确性。

转换规则

  1. 从低精度到高精度

    • 当不同精度的类型混合运算时,低精度类型会自动转换为高精度类型。
    • 转换顺序:
      doublefloat

      long

      unsigned

      intchar, short
  2. 从右向左必转

    • 在赋值运算中,右侧的值会被转换为左侧变量的类型。
  3. 从高精度到低精度

    • 如果高精度类型赋值给低精度类型,可能会发生精度丢失数据截断

示例代码

#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;
}

解析过程:

  1. a + bbchar)被提升为 int,结果为 10 + 97 = 107
  2. 107 + ccfloat)被提升为 double,结果为 107.0 + 1.5 = 108.5
  3. d * bbchar)被提升为 double,结果为 8765.1234 * 97.0 = 849420.2998
  4. 108.5 - 849420.2998:结果为 -849311.7998

输出结果:

Result: -849311.799800

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值