C语言基础之【运算符与表达式】

往期 C语言 知识回顾:
链接:
C语言基础之【C语言概述】
C语言基础之【数据类型】(上)
C语言基础之【数据类型】(下)


👨‍💻 博主正在持续更新C语言基础系列中。
❤️ 如果你觉得内容还不错,请多多点赞。

⭐️ 如果你觉得对你有帮助,请多多收藏。(防止以后找不到了)

👨‍👩‍👧‍👦 C语言基础系列 持续更新中~,后续分享内容主要涉及 C++全栈开发 的知识,如果你感兴趣请多多关注博主。


常用运算符分类

运算符 :C语言中用于操作数据的基本工具。

运算符类型作用
算术运算符用于基本的数学运算
赋值运算符用于给变量赋值
关系运算符用于比较两个值的大小关系(并返回一个布尔值)
逻辑运算符用于逻辑判断(并返回一个布尔值)
位运算符用于对二进制位进行操作
条件运算符用于简单的条件判断
指针运算符用于操作指针
逗号运算符用于分隔多个表达式,返回最后一个表达式的值
类型转换运算符用于强制类型转换
sizeof运算符用于获取数据类型或变量的大小(字节数)
  • 算术运算符:包括 +-*/%++-- 等。

  • 赋值运算符:包括 =+=-=*=/=%=<<=>>=&=^=|= 等。

  • 关系运算符:包括 ==!=><>=<= 等。

    • 也称为比较运算符
  • 逻辑运算符:包括 &&||! 等。

  • 位运算符:包括 &|^~<<>> 等。

  • 条件运算符? :

    • 也称为三元运算符,其格式为表达式1? 表达式2 : 表达式3
  • 指针运算符:包括 &*

    • *用于获取指针所指向的变量的值。

    • &用于获取变量的地址。

  • 逗号运算符,

    • 例如:int a = (1 + 2, 3 + 4);a的值为7
  • 类型转换运算符(类型)

  • sizeof运算符

    • sizeof(int)可以得到int类型在当前系统中所占用的字节数
    • sizeof(a)可以得到变量a所占用的字节数

算术运算符

算术运算符 :用于基本的数学运算

运算符术语示例结果
+正号+33
-负号-3-3
+10 + 515
-10 - 55
*10 * 550
/10 / 52
%取模(取余)10 % 31
++前置自增a=2; b=++a;a=3; b=3;
++后置自增a=2; b=a++;a=3; b=2;
--前置自减a=2; b=--a;a=1; b=1;
--后置自减a=2; b=a--;a=1; b=2;
  1. 正号 (+):表示正数,通常可以省略。
  2. 负号 (-):表示负数。
  3. 加 (+):用于两个数的加法运算。
  4. 减 (-):用于两个数的减法运算。
  5. 乘 (*):用于两个数的乘法运算。
  6. 除 (/):用于两个数的除法运算。
  7. 取模 (%):用于两个数的取模运算,返回余数。
  8. 前置自增 (++):先自增,再使用变量的值。
  9. 后置自增 (++):先使用变量的值,再自增。
  10. 前置自减 (--):先自减,再使用变量的值。
  11. 后置自减 (--):先使用变量的值,再自减。

  • 前置自 增/减 和 后置自 增/减 的区别在于变量值的更新时机

赋值运算符

赋值运算符 :用于给变量赋值

运算符术语示例结果
=赋值a=2; b=3;a=2; b=3;
+=加等于a=0; a+=2;a=2;
-=减等于a=5; a-=3;a=2;
*=乘等于a=2; a*=2;a=4;
/=除等于a=4; a/=2;a=2;
%=模等于a=3; a%=2;a=1;
  1. 赋值 (=):将右侧的值赋给左侧的变量。
  2. 加等于 (+=):将左侧变量与右侧值相加,结果赋给左侧变量。
  3. 减等于 (-=):将左侧变量与右侧值相减,结果赋给左侧变量。
  4. 乘等于 (\*=):将左侧变量与右侧值相乘,结果赋给左侧变量。
  5. 除等于 (/=):将左侧变量与右侧值相除,结果赋给左侧变量。
  6. 模等于 (%=):将左侧变量与右侧值取模,结果赋给左侧变量。

关系运算符

关系运算符 :用于比较两个值的大小关系,返回布尔值(1 表示真,0 表示假)

运算符术语示例结果
==等于4 == 30
!=不等于4 != 31
<小于4 < 30
>大于4 > 31
<=小于等于4 <= 30
>=大于等于4 >= 31
  1. ==:检查两个值是否相等,相等返回 1,否则返回 0
  2. !=:检查两个值是否不相等,不相等返回 1,否则返回 0
  3. <:检查左侧值是否小于右侧值,是则返回 1,否则返回 0
  4. >:检查左侧值是否大于右侧值,是则返回 1,否则返回 0
  5. <=:检查左侧值是否小于或等于右侧值,是则返回 1,否则返回 0
  6. >=:检查左侧值是否大于或等于右侧值,是则返回 1,否则返回 0

逻辑运算符

逻辑运算符 :用于逻辑判断(并返回一个布尔值)

运算符术语示例结果
!逻辑非!a用于对一个布尔值取反
&&逻辑与a && b用于判断两个条件是否同时为真
逻辑或用于判断两个条件是否至少有一个为真

!(逻辑非)

  • 如果操作数为真(非零),则结果为假(0
  • 如果操作数为假(0),则结果为真(1

&&(逻辑与)

  • 只有当两个操作数都为真时,结果才为真(1
  • 否则为假(0

||(逻辑或)

  • 只要有一个操作数为真,结果就为真(1
  • 只有当两个操作数都为假时,结果才为假(0

运算符优先级

运算符优先级: 决定了表达式中运算符的执行顺序。

优先级运算符名称或含义使用形式结合方向说明
1[]数组下标数组名[常量表达式]左到右
()圆括号(表达式)/函数名(形参表)左到右
.成员选择(对象)对象.成员名左到右
->成员选择(指针)对象指针->成员名左到右
2-负号运算符-表达式右到左单目运算符
~按位取反运算符~表达式右到左单目运算符
++自增运算符++变量名/变量名++右到左单目运算符
--自减运算符–变量名/变量名–右到左单目运算符
*取值运算符*指针变量右到左单目运算符
&取地址运算符&变量名右到左单目运算符
!逻辑非运算符!表达式右到左单目运算符
(类型)强制类型转换(数据类型)表达式右到左
sizeof长度运算符sizeof(表达式)右到左
3*表达式*表达式左到右双目运算符
/表达式/表达式左到右双目运算符
%余数(取模)整型表达式%整型表达式左到右双目运算符
4+表达式+表达式左到右双目运算符
-表达式-表达式左到右双目运算符
5<<左移变量<<表达式左到右双目运算符
>>右移变量>>表达式左到右双目运算符
6>大于表达式>表达式左到右双目运算符
>=大于等于表达式>=表达式左到右双目运算符
<小于表达式<表达式左到右双目运算符
<=小于等于表达式<=表达式左到右双目运算符
7==等于表达式==表达式左到右双目运算符
!=不等于表达式!=表达式左到右双目运算符
8&按位与表达式&表达式左到右双目运算符
9^按位异或表达式^表达式左到右双目运算符
10按位或表达式|表达式左到右双目运算符
11&&逻辑与表达式&&表达式左到右双目运算符
12逻辑或表达式||表达式左到右双目运算符
13?:条件运算符表达式1?表达式2:表达式3右到左三目运算符
14=赋值运算符变量=表达式右到左
*=乘后赋值变量*=表达式右到左
/=除后赋值变量/=表达式右到左
%=取模后赋值变量%=表达式右到左
+=加后赋值变量+=表达式右到左
-=减后赋值变量-=表达式右到左
<<=左移后赋值变量<<=表达式右到左
>>=右移后赋值变量>>=表达式右到左
&=按位与后赋值变量&=表达式右到左
^=按位异或后赋值变量^=表达式右到左
按位或后赋值变量|=表达式右到左
15,逗号运算符表达式,表达式,…左到右
  • 优先级高的运算符先执行
  • 优先级相同的运算符按结合方向执行

类型转换

类型转换 :指将一种数据类型的值转换为另一种数据类型的过程。

数据有不同的类型,不同类型数据之间进行混合运算时必然涉及到类型的转换问题。

类型转换可以分为两种:

  • 隐式类型转换(自动类型转换):隐式类型转换是由编译器自动完成的。

    • 表达式中包含不同类型的操作数。
    • 赋值时,右侧表达式的类型与左侧变量的类型不一致。
  • 显式类型转换(强制类型转换):通过程序员手动指定的。

    • 使用强制类型转换运算符 (类型)
    • 语法:(目标类型) 表达式

隐式类型转换:

  1. 从小类型向大类型转换
    如果表达式中包含不同类型的操作数,较小的类型会自动转换为较大的类型。

    在这里插入图片描述

    int a = 10;
    double b = 3.14;
    double c = a + b; // a 自动转换为 double 类型
    
  2. 赋值时的类型转换

    如果赋值时右侧表达式的类型与左侧变量的类型不一致,右侧的值会自动转换为左侧变量的类型。

    int a = 10;
    double b = 3.14;
     a = b; // b 的值被截断为 int 类型,a = 3
    

显式类型转换:

int a = 10;
int b = 3;
double c = (double)a / b; // 将 a 强制转换为 double 类型,结果为 3.333...

注意事项:强制类型转换可能会导致数据丢失或精度损失。

double d = 3.14;
int i = (int)d; // i = 3,小数部分丢失

类型转换的常见场景
1.算术运算中的类型转换

  • 如果表达式中包含不同类型的操作数,较小的类型会自动转换为较大的类型。

    int a = 10;
    double b = 3.14;
    double c = a + b; // a 自动转换为 double 类型
    

2.赋值时的类型转换

  • 如果赋值时右侧表达式的类型与左侧变量的类型不一致,右侧的值会自动转换为左侧变量的类型。

      int a = 10;
      double b = 3.14;
      a = b; // b 的值被截断为 int 类型,a = 3
    

3.函数调用时的类型转换

  • 如果函数参数的类型与实参的类型不一致,实参的值会自动转换为形参的类型。

    void print(double d) 
    {
       printf("%f\n", d);
    }
     int main() 
    {
        int a = 10;
        print(a); // a 自动转换为 double 类型
        return 0;
    }
    

4.指针类型转换

  • 指针类型之间的转换需要显式类型转换。

    int a = 10;
    int *p = &a;
    double *q = (double *)p; // 将 int 指针强制转换为 double 指针
    

隐式类型转换

#include <stdio.h>

int main()
{
	int num = 5;
	printf("s1=%d\n", num / 2);
	printf("s2=%lf\n", num / 2.0);

	return 0;
}

输出:

s1=2
s2=2.500000


1.整数除法

  • 当两个整数相除时,结果也是整数,小数部分会被截断。
    • 例如:5 / 2 的结果是 2

2.浮点数除法

  • 当至少有一个操作数是浮点数时,结果也是浮点数。
    • 例如:5 / 2.0 的结果是 2.5

总结:整数除法会截断小数部分,而浮点数除法会保留小数部分。

显式类型转换

显式类型转换指的是使用强制类型转换运算符,将一个变量或表达式转化成所需的类型。

其基本语法格式:(类型说明符) (表达式)

#include <stdio.h>

int main()
{
	float x = 0;
	int i = 0;
	x = 3.6f;

	i = x;			//x为实型, i为整型,直接赋值会有警告
	i = (int)x;		//使用强制类型转换

	printf("x=%f, i=%d\n", x, i);

	return 0;
}

输出:

x=3.600000, i=3

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

序属秋秋秋

😘

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值