C语言:20250710笔记

发布于:2025-07-13 ⋅ 阅读:(23) ⋅ 点赞:(0)

内容提要

  • 运算符

    • 算术运算符

    • 赋值运算符

    • 关系运算符

    • 逻辑运算符

    • 逗号运算符

    • 位运算

  • 流程控制

    • 算法

    • 程序的三种结构

    • C语句

运算符

各类数值型数据间的混合运算

  • 整型、浮点型、字符型数据可以进行混合运算,如:

       2840 - 'a' * 2.9
     = 2840.0 - 97 * 2.9     // 保证参与运算的都是数字
     = 2840.0 - 97.0 * 2.9 // 不同数据类型可以参与运算,编译器会自动将其转换为同一数据类型后再运算(隐式类型转换)    

    解释:整型、浮点型、字符型之间都可以参与混合运算,是因为它们都是数值型,字符是特殊的数值型(字符参与数值计算使用的是ASCII码(0~127))

    运算时,参与运算的两个运算数如果类型不同,则首先将其类型转换为一致再运算。转换规则分为隐式转换显示转换

隐式转换

将低等级类型自动提升为高等级类型,又被称作自动类型转换。是由编译系统在控制类型转换。

语法:

高等级类型 变量名 = 低等级类型变量;

转换关系:

① (低等级类型)int → unsigned int → long → double(高等级类型)

注意:int 与 unsigned int 的转换顺序可能因为平台(如位数)和编译器不同而有差异,需结合具体环境判断。

② (低等级类型)char /short → int(高等级类型)

③ (低等级类型)float → double(高等级类型)

注意:

在混合运算过程中,系统所进行的类型转换并不会改变原数据的类型(不会改变原数据在内存的存储),只是在运算过程中将其值变成同类型后运算,举例:

int a = 12;  // a 是 int
double c = a + 22.5;// 此时 a在参与运算的时候临时转换为double类型,就变成了 double c = 12.0 + 22.5
a = 21;      // a 是 int
float c2 = a + 21.5f; // 此时 a在参与运算的时候临时转换为float类型,就变成了 float c2 = 21.0f + 21.5f
a = 12;      // a 是 int
显示转换

需要我们手动指定转换类型,又被称作强制类型转换。是由程序员自己来控制转换。

语法:

(type)(表达式)

举例:

  • (double) a:将a的值转换为double类型。

  • (int)(x+y):将x+y的结果转换为int类型。

  • (int)x+y:将x的值转换为int后与y参与加法运算。

举例:

double a = 2, b = 3;  // a,b都是double类型
double c = (int)a + b;// 首先将a转换为int类型,此时为显示转换;然后混合运算的时候a转换为double类型,此时隐式转换

double num1 = 12.55;   // num1是double类型
int num2 = (int)num1;  // num1原本是double类型,在赋值运算时,显示转换为int类型
printf("%d\n", num2);  // 12  注意:小数转整数,会舍弃掉小数部分,保留整数部分
num1 = 15;  // 此时num1依然是double

注意:类型转换只是发生在程序运行过程中,并不会改变其在内存中的存储形式。在强制类型转换的过程中,并不改变原变量的类型,只是在运算过程中将其值转换类型后再运算。

案例:
  • 需求:强制类型转换案例

  • 代码:

  •  #include <stdio.h>
     ​
     int main(int argc,char *argv[])
     {
         float x;
         int i;
     ​
         x = 3.6f;  // float类型的变量,如果赋值是同类型常量,常量需要跟上F/f
         i = (int)x;// 将x在程序运行阶段,强制转换为int类型
     ​
         printf("x=%f,i=%d\n",x,i); // x=3.600000,i=3 浮点型数据转换为整型,会丢失小数部分
     ​
     ​
         return 0;
     }

  • 说明:x仍然为float类型,可见强制类型转换并不会改变变量原本的类型。

C运算符和C表达式

C运算符
序号 名称 符号 序号 名称 符号
1 算术运算符 + - * / % ++ -- 8 指针运算符 * &
2 关系运算符 > < >= <= == != 9 字节数运算符 sizeof
3 逻辑运算符 && || ! 10 下标运算符 []
4 位运算符 << >> ~ | ^ & 11 强制类型转换运算符 (type)
5 赋值运算符 = += -= *= /= %= 12 分量运算符 . ->
6 条件运算符 ?: 13 其他 函数调用运算符()
7 逗号运算符 ,
C表达式

所谓表达式就是将操作对象用运算符连接起来的符合C语法规则的式子。(表达式 = 运算数 + 运算符)

序号 名称 举例
1 算术表达式 2 + 6.7 * 3.5 计算结果是数值类型
2 关系表达式 x > 0, y < z + 6 计算结果是布尔类型,0-假 和 非0-真
3 逻辑表达式 x > 0 && y > 0 计算结果是布尔类型,0-假 和 非0-真
4 赋值表达式 a = 5.6, sum += i 规则:由右往左
5 逗号表达式 x = 3,y+=4,z-=8 分隔,并列,计算结果就是最后一个表达式的值

C语言规定了运算符的优先级和结核性。在表达式求值时,按运算符的优先级的高低次序执行。如果运算符对象两侧的运算符优先级相同,如a +b +c,则按照规定的“结合方向”处理。

C语言运算符优先级

算数运算符

基本的算数运算符

+,-正负值运算符(单目/一元运算符:只有一个运算数),举例:

+5   // 正5
5    // 正5
-5   // 负5

+,-,*,/,%加减乘除取余运算符(双目/二元运算符:有两个运算数)注意:除法运算中,除数不能为0

这些算数运算符的运算顺序与数学上的运算顺序是相同。*,/,%的优先级高于+,-

表达式和运算符的优先级与结合性
算数表达式

定义:用算数运算符和括号将运算对象链接起来,符合C语言规范的算式,例如:

a * b / c - 1.5 + 'A'
  • 表达式中各种运算符的运算顺序,必要时需要添加括号,例如:

    ((a+b) / (c+d)) != (a+b / c+d)
  • 表达式中各种运算对象的数据类型,特别是整型相除,C语言规定,两个整型相除,其结果仍然为整型。例如:

     7/6    值   1
     4/7    值   0
     1/2    值   0
  • 面试题:

     1. 1/2 + 1/2的结果是多少?     正确答案:0
     2. 1.0/2 + 1.0/2的结果是多少? 正确答案:1
优先级与结合性

定义:在表达式求解的时候,先按运算符的优先级别的高低次序执行。若一个运算对象两侧的运算符的优先级相同,则按规定的结合方向处理。

各种运算符的结合方向

① 算数运算符的结合方向:自左向右,也就是运算对象先与左边的运算符结合,例如:

a - b + c;    // 先计算 a - b,然后用其减出来的结果 + c

② 特殊运算符的结合方向:自右向左,也就是运算对象先与右边的运算符结合,例如:

i++;

③ 若一个运算符两侧的数据类型不同,会自动转换为同类型后计算。

  12 + 12.5 + 'A'
= 12.0 + 12.5 + 'A'    
= 24.5 + 65
= 24.5 + 65.0
= 89.5
自增、自减运算符

作用:使变量的值增1或者减1

结合方向:自左向右 / 自右向左

++i,--i

结合方向:自左向右

表示在使用该运算符对象之前,先让运算数i自身增1或者减1,然后再使用它,也就是使用增1或者减1后的值。

先计算,后使用

说明:

① 先计算:先让计算数 i = i + 1

② 后使用:将计算后的运算数进行赋值、比较等操作

举例:

int i = 1;  // i = 1
int x = ++i;// ++i可以看做是一个没有名字的新变量,
// 上面两行代码等价于:
// int i = 1; 
// i = i + 1; 
// int x = i;
printf("i=%d,x=%d\n",i,x);  // i=2,x=2
printf("i=%d,x=%d\n",++i,x);// i=3,x=2

int a = 1;
printf("a=%d\n",++a);       // a=2


网站公告

今日签到

点亮在社区的每一天
去签到