C语言中的运算符

news2024/9/25 1:25:48

一,算数运算符

基本算术运算符:


加法(+):用于两个数相加。例如 int a = 3 + 5;,结果 a 的值为 8。
减法(-):两个数相减。如 int b = 7 - 4;,b 的值为 3。
乘法(*):两数相乘。int c = 2 * 6;,c 为 12。
除法(/):整数除法会截断结果的小数部分。例如 int d = 10 / 3;,d 的值为 3。
取余(%):也叫模运算,用于计算两个整数相除的余数。例如 int e = 10 % 3;,e 的值为 1。

运行结果:


自增和自减运算符:


自增(++):使变量的值增加 1。分为前置和后置两种形式。前置自增(如 ++a)先将变量的值加 1,然后再使用变量的值;后置自增(如 a++)先使用变量的值,然后再将变量的值加 1。自减(--):使变量的值减少 1,也有前置和后置两种形式。

运行结果:

二,关系运算符

一、等于运算符(==)

  1. 作用:判断两个值是否相等。

    • 例如:if (a == b),如果变量 a 的值等于变量 b 的值,那么这个条件判断为真。
    • 不仅可以用于基本数据类型(如整数、浮点数、字符等)的比较,也可以用于指针的比较(判断两个指针是否指向同一个地址)。
  2. 注意事项:

    • 与赋值运算符(=)容易混淆。赋值运算符是将一个值赋给一个变量,而等于运算符是判断两个值是否相等。例如,if (a = 5)是错误的用法,应该是if (a == 5)

二、不等于运算符(!=)

  1. 作用:判断两个值是否不相等。

    • 例如:if (a!= b),如果变量 a 的值不等于变量 b 的值,那么这个条件判断为真。
    • 同样可以用于各种数据类型和指针的比较。
  2. 注意事项:与等于运算符相对应,在使用时要注意逻辑的正确性。

三、大于运算符(>)

  1. 作用:判断左边的值是否大于右边的值。

    • 例如:if (a > b),如果变量 a 的值大于变量 b 的值,那么这个条件判断为真。
    • 适用于数值类型的比较,对于字符类型,实际上是比较其对应的 ASCII 码值。
  2. 注意事项:只能用于可比较大小的数据类型,对于没有大小关系的数据类型(如结构体,除非自定义了比较函数)不能使用。

四、小于运算符(<)

  1. 作用:判断左边的值是否小于右边的值。

    • 例如:if (a < b),如果变量 a 的值小于变量 b 的值,那么这个条件判断为真。
    • 与大于运算符类似,适用于数值类型和字符类型的比较。
  2. 注意事项:同样要注意数据类型的适用性。

五、大于等于运算符(>=)

  1. 作用:判断左边的值是否大于或等于右边的值。

    • 例如:if (a >= b),如果变量 a 的值大于或等于变量 b 的值,那么这个条件判断为真。
    • 在需要判断一个值是否在某个范围之上(包括边界值)时非常有用。
  2. 注意事项:确保比较的逻辑符合预期。

六、小于等于运算符(<=)

  1. 作用:判断左边的值是否小于或等于右边的值。

    • 例如:if (a <= b),如果变量 a 的值小于或等于变量 b 的值,那么这个条件判断为真。
    • 常用于判断一个值是否在某个范围之下(包括边界值)。
  2. 注意事项:与其他关系运算符一样,注意数据类型和逻辑的正确性。

关系运算符通常在条件判断语句(如 if 语句、while 循环等)中使用,以控制程序的流程根据不同的比较结果执行不同的代码分支。

运行结果:

三,逻辑运算符

一、逻辑与运算符(&&)

  1. 作用:

    • 当且仅当两个条件都为真时,整个表达式的结果才为真。如果其中任何一个条件为假,那么整个表达式的结果为假。
    • 例如:if (a > 0 && b < 10),只有当变量 a 的值大于 0 并且变量 b 的值小于 10 时,这个条件判断才为真。
  2. 短路特性:

    • 如果第一个条件为假,那么就不会再去判断第二个条件,因为无论第二个条件的结果如何,整个表达式的结果都已经确定为假。
    • 例如:if ((a == NULL) && (a->value == 5)),如果 a 是一个指针且为 NULL,那么就不会去判断 a->value == 5 这个条件,因为此时整个表达式已经确定为假,避免了因访问 NULL 指针而导致的错误。

二、逻辑或运算符(||)

  1. 作用:

    • 只要两个条件中有一个为真,整个表达式的结果就为真。只有当两个条件都为假时,整个表达式的结果才为假。
    • 例如:if (a == 5 || b == 8),如果变量 a 的值等于 5 或者变量 b 的值等于 8,那么这个条件判断就为真。
  2. 短路特性:

    • 如果第一个条件为真,那么就不会再去判断第二个条件,因为无论第二个条件的结果如何,整个表达式的结果都已经确定为真。
    • 例如:if ((a!= NULL) || (b = allocateMemory())),如果 a 不是 NULL,那么就不会去调用 allocateMemory() 函数来判断第二个条件,因为此时整个表达式已经确定为真,避免了不必要的函数调用。

三、逻辑非运算符(!)

  1. 作用:

    • 对一个条件取反。如果条件为真,那么 ! 操作后结果为假;如果条件为假,那么 ! 操作后结果为真。
    • 例如:if (!(a > b)),如果变量 a 的值不大于变量 b 的值,那么这个条件判断为真。
  2. 注意事项:

    • 逻辑非运算符是一元运算符,只作用于一个条件表达式。
    • 在使用时要注意逻辑的正确性,避免因取反而导致的意外结果。

逻辑运算符在 C 语言中广泛用于条件判断和控制程序的流程,通过组合多个条件可以实现复杂的逻辑判断。

运行结果:

四,位运算符

 在 C 语言中,位运算符用于对二进制位进行操作。所以进行比较的时候是把我们常见的十进制数字转换为二进制数字,和其他语言不太一样,例如java语言的位运算符,有的也只是逻辑运算符的功能.

一、按位与运算符(&)

  1. 作用:

    • 对应位都为 1 时结果为 1,否则为 0。
    • 例如,假设 a = 5(二进制为 0101),b = 3(二进制为 0011),那么 a & b 的结果为 1(二进制为 0001)。
  2. 应用场景:

    • 可以用于提取某些特定的位。比如要判断一个整数的最低位是否为 0,可以将这个整数与 1(二进制为 0001)进行按位与操作,如果结果为 0,则最低位为 0。
    • 用于清除某些特定的位。将一个数与一个所有要清除的位为 0 的数进行按位与操作,就可以将这些位清为 0。

二、按位或运算符(|)

  1. 作用:

    • 对应位只要有一个为 1 时结果为 1。
    • 例如,对于上面的 a = 5 和 b = 3a | b 的结果为 7(二进制为 0111)。
  2. 应用场景:

    • 设置某些特定的位。将一个数与一个所有要设置的位为 1 的数进行按位或操作,就可以将这些位设置为 1。
    • 合并两个标志或状态。如果不同的位代表不同的状态,可以使用按位或操作来合并两个状态。

三、按位异或运算符(^)

  1. 作用:

    • 对应位不同时结果为 1。
    • 例如,a = 5 和 b = 3a ^ b 的结果为 6(二进制为 0110)。
  2. 应用场景:

    • 交换两个变量的值而不使用临时变量。例如,a = a ^ b; b = a ^ b; a = a ^ b;,通过三次异或操作可以实现 a 和 b 的值交换。
    • 加密和解密。在一些简单的加密算法中,可以使用异或操作对数据进行加密,然后再用相同的密钥进行异或操作来解密。

四、左移运算符(<<)

  1. 作用:

    • 将一个数的二进制位向左移动指定的位数。左边移出的位被丢弃,右边补 0。
    • 例如,a = 5a << 2 的结果为 20(二进制为 10100)。
  2. 应用场景:

    • 快速实现乘以 2 的幂次方的操作。将一个数左移 n 位,相当于乘以 2 的 n 次方。
    • 在某些位操作场景中,用于调整位的位置。

五、右移运算符(>>)

  1. 作用:

    • 将一个数的二进制位向右移动指定的位数。如果是无符号数,左边补 0;如果是有符号数,根据符号位进行填充(正数补 0,负数补 1)。
    • 例如,a = -5(二进制为 11111111111111111111111111111011),a >> 2 的结果为 -2(二进制为 11111111111111111111111111111110)。
  2. 应用场景:

    • 快速实现除以 2 的幂次方的操作。将一个数右移 n 位,相当于除以 2 的 n 次方。
    • 在某些需要对二进制位进行调整的场景中使用。

运算结果:

运算结果:

五,赋值运算符

一、基本赋值运算符(=)

  1. 作用:

    • 将右侧的值赋给左侧的变量。
    • 例如,int a = 5;,这里将整数 5 赋值给变量 a
  2. 注意事项:

    • 左侧必须是一个可修改的左值,通常是变量名、数组元素或指针所指向的内存位置等。
    • 赋值运算符的优先级相对较低,在复杂表达式中要注意使用括号来明确运算顺序。

二、复合赋值运算符

  1. 加法赋值运算符(+=):

    • 作用:先将左侧变量的值与右侧的值相加,然后将结果再赋给左侧变量。
    • 例如,int b = 3; b += 2;,相当于 b = b + 2;,执行后 b 的值为 5。
  2. 减法赋值运算符(-=):

    • 作用:先将左侧变量的值减去右侧的值,然后将结果再赋给左侧变量。
    • 例如,int c = 5; c -= 3;,相当于 c = c - 3;,执行后 c 的值为 2。
  3. 乘法赋值运算符(*=):

    • 作用:先将左侧变量的值与右侧的值相乘,然后将结果再赋给左侧变量。
    • 例如,int d = 4; d *= 3;,相当于 d = d * 3;,执行后 d 的值为 12。
  4. 除法赋值运算符(/=):

    • 作用:先将左侧变量的值除以右侧的值,然后将结果再赋给左侧变量。
    • 例如,int e = 10; e /= 2;,相当于 e = e / 2;,执行后 e 的值为 5。注意,如果右侧的值为 0,会导致运行时错误。
  5. 取余赋值运算符(%=):

    • 作用:先将左侧变量的值与右侧的值进行取余运算,然后将结果再赋给左侧变量。
    • 例如,int f = 11; f %= 4;,相当于 f = f % 4;,执行后 f 的值为 3。

复合赋值运算符的优点在于可以使代码更加简洁,并且在某些情况下可以提高程序的执行效率,因为编译器可能会对复合赋值运算符进行一些优化。

六,逗号运算符和三目运算符

1,逗号运算符

(1)、逗号运算符的作用

  1. 连接多个表达式:

    • 逗号运算符可以将多个表达式依次连接起来,从左到右依次计算每个表达式的值。
    • 例如:int a = 1, b = 2, c = 3;,这里使用逗号运算符同时声明并初始化了三个变量。
  2. 确定整个逗号表达式的值:

    • 逗号表达式的值是最后一个表达式的值。
    • 例如:int x; x = (a = 5, b = a + 2, c = b * 3);,这里先给 a 赋值为 5,然后 b 被赋值为 a + 2 即 7,接着 c 被赋值为 b * 3 即 21,最后整个逗号表达式的值为 21,所以 x 的值为 21。
(2)、逗号运算符的应用场景

  1. 在 for 循环中:

    • 逗号运算符在 for 循环的初始化和更新部分经常被使用,可以同时初始化多个变量或进行多个变量的更新操作。
    • 例如:for (int i = 0, j = 10; i < j; i++, j--) { /* loop body */ },这里在 for 循环的初始化部分同时初始化了两个变量 i 和 j,在更新部分同时对 i 进行自增和对 j 进行自减操作。
  2. 函数参数列表中:

    • 在一些函数调用中,可以使用逗号运算符将多个参数连接起来传递给函数。
    • 例如:printf("%d, %d\n", a, (b = 5, b + 2));,这里先给 b 赋值为 5,然后计算 b + 2 的值为 7,最后将 a 的值和 7 依次传递给 printf 函数进行输出。
  3. 复杂表达式中:

    • 在一些复杂的表达式中,可以使用逗号运算符来组织多个子表达式,使代码更加清晰。
    • 例如:int result = ((a > b)? a : b, (c > d)? c : d);,这里先根据条件判断选择 a 和 b 中的较大值,然后选择 c 和 d 中的较大值,最后整个逗号表达式的值是 c 和 d 中的较大值,所以 result 的值为 c 和 d 中的较大值。

实例:

2,三目运算符

(1)、三目运算符的形式和作用

  1. 形式:

    • 表达式 1? 表达式 2 : 表达式 3。
  2. 作用:

    • 首先计算表达式 1,如果表达式 1 的值为真(非零值),则整个三目运算符的结果为表达式 2 的值;如果表达式 1 的值为假(零值),则整个三目运算符的结果为表达式 3 的值。

    • 例如:int max = (a > b)? a : b;,如果变量 a 的值大于变量 b 的值,那么 max 的值为 a;否则,max 的值为 b

(2)、三目运算符的应用场景

  1. 简洁的条件赋值:

    • 当需要根据一个条件进行赋值操作时,三目运算符可以提供一种简洁的方式。
    • 例如:int flag = (condition)? 1 : 0;,如果 condition 为真,则 flag 被赋值为 1;否则,flag 被赋值为 0。
  2. 在函数调用中:

    • 可以根据条件选择不同的函数参数进行函数调用。
    • 例如:printf("%s\n", (flag)? "True" : "False");,根据 flag 的值打印不同的字符串。
  3. 在表达式中简化条件判断:

    • 在一些复杂的表达式中,可以使用三目运算符来简化条件判断。
    • 例如:int result = (a > b)? (a + c) : (b + c);,根据 a 和 b 的大小关系选择不同的表达式进行计算。
(3)、三目运算符的注意事项

  1. 可读性:

    • 虽然三目运算符可以使代码更加简洁,但在某些情况下,过度使用可能会降低代码的可读性。如果条件和结果表达式非常复杂,使用 if-else 语句可能会使代码更易于理解。
  2. 优先级:

    • 三目运算符的优先级较低,在复杂表达式中要注意使用括号来明确运算顺序,以避免出现意外的结果。

实例:

运行结果:

七,运算符的优先级

(这很关键)

优先级运算符结合律
1后缀运算符: [] () · -> ++ --(类型名称){列表}从左到右
2一元运算符: ++ -- ! ~ + - * & sizeof_Alignof从右到左
3类型转换运算符: (类型名称)从右到左
4乘除法运算符: * / %从左到右
5加减法运算符: + -从左到右
6移位运算符: << >>从左到右
7关系运算符: <<= >>=从左到右
8相等运算符: == !=从左到右
9位运算符 AND: &从左到右
10位运算符 XOR: ^从左到右
11位运算符 OR: |从左到右
12逻辑运算符 AND: &&从左到右
13逻辑运算符 OR: ||从左到右
14条件运算符: ?:从右到左
15赋值运算符: = += -= *= /= %= &= ^= |= <<= >>=从右到左
16逗号运算符:,从左到右

Tips:
<1>表中优先级最高的运算符中的最后一个(类型名称) {列表} 是 C99 新增加的。
<2>一些运算符记号在表中出现了两次。例如,自增运算符 ++ 和自减运算符 --,在作后缀运算符(如表]达式 x++)时,较其用作前缀运算符(如表达式 ++x)时,具有较高的优先级。
<3>+、 -、 * 和 & 运算符记号不但可以当作一元运算符(unary operator,只需要一个操作数),也可以当作二元运算符(binary operator,需要两个操作数)。例如, * 只有一个操作数的时候,就是间接运算符(indirection operator),而有两个操作数的时候,就是乘号。


简单速记: ! > 算术运算 > 关系运算 > 逻辑运算 > 赋值运算
 

有个简单的小问题,思考一下:定义三个整数a,b,c,并从键盘进行赋值,然后进行排序。最终输出,a保存最小值, b保存其次, c保存最大值.
例如:
用户输入 a = 30,b = 20,c = 10.要求最终保存的结果为
a = 10,b = 20,c = 30

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2084139.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用推测解码提高 LLM 推理速度

使用尖端优化技术加速推理的实用指南 欢迎来到雲闪世界。大型语言模型非常耗电&#xff0c;需要大量 GPU 资源才能发挥良好性能。然而&#xff0c;Transformer 架构并没有充分利用 GPU。 从设计上讲&#xff0c;GPU 可以并行处理&#xff0c;但 Transformer 架构是自回归的。为…

哈希表两数求和

leetcode题目链接 这道题思路可以说easy 首先想到的就是两层for循环 代码如下 class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {vector<int>result;int lengthnums.size();for(int i0;i<length;i){for(int ji1;j<…

【drools】电影推荐搭建

同步用了很久很久 反复了很多了次,最终: drools用的都是9.*** Y9KP 代码 D:\Future\06_movie-recommendation-system-springboot-drools-rule-engine\recommendation\src\main\resources\com.recommendation.movie.rules\medicine_symptoms.drl在spring boot 中集成drools做电…

16.神经网络 - 卷积层

神经网络 - 卷积层 pytorch官网网站卷积层&#xff08;Convolution Layers&#xff09;&#xff1a;Convolution Layers nn.Conv1d 一维卷积Applies a 1D convolution over an input signal composed of several input planes.nn.Conv2d 二维卷积Applies a 2D convolution ov…

扁线电机介绍

相比于圆线&#xff0c;扁线因为扁平矩形的特殊性能够让线圈缠绕更加紧密&#xff0c;槽满率由原先的40%提升到70%。 这意味着相同体积下线圈中的导线更多&#xff0c;电流的传导效率更高&#xff0c;能够减少电阻损耗&#xff0c;产生的磁场更强&#xff0c;电机功率也就更大&…

【软件工程】软件与软件危机

考点1 软件与软件危机 一、软件 1. 定义 在计算机系统支持下&#xff0c;能够完成特定功能和性能的程序、数据和相关的文档。 2. 软件的分类 二、软件危机 在计算机软件开发和维护过程中所遇到的一系列严重问题。 1. 包含两个方面&#xff1a; 如何开发软件如何维护软件…

Rocm-HIP kernel language

HIP的内核启动语法hipLaunchKernelGGL是一个宏&#xff0c;可以作为启动内核的替代方式&#xff0c;它接受启动配置的参数&#xff08;网格维度、分组维度、流、动态共享大小&#xff09;以及任意数量的内核参数。这个宏可以替代CUDA中的三连字符&#xff08;<<< >…

[记录] linux 虚拟机装 windows10

简介 本机系统&#xff1a;Ubuntu22.04 虚拟机&#xff1a;gnome-boxes 相关资料&#xff1a;度盘 安装流程 安装 gnome-boxes sudo apt install gnome-boxes安装 windows10 打开 Boxes, 选择准备好的 windows10 ISO 文件 可以从官网下载&#xff0c;也可以从我给的资料里获…

OpenCV小练习:身份证号码识别

目标&#xff1a;针对一张身份证照片&#xff0c;把身份证号码识别出来&#xff08;转成数字或字符串&#xff09;。 实现思路&#xff1a;需要将目标拆分成两个子任务&#xff1a;(1) 把身份证号码区域从整张图片中检测/裁剪出来&#xff1b;(2) 将图片中的数字转化成文字。第…

【python】OpenCV—Multi Human Pose Estimation

文章目录 1、背景介绍2、关键点检测模型3、源码与结果4、源码解读——检测关键点5、源码解读——找到有效对6、源码解读——组装个人关键点7、涉及到的库cv2.dnn.blobFromImage 8、参考 1、背景介绍 【python】OpenCV—Single Human Pose Estimation 本文以 COCO 格式为例&am…

低代码门户技术:赋能业务灵活性与创新的新时代

随着数字化转型的深入推进&#xff0c;各行各业对灵活、高效的技术解决方案的需求日益增长。在这个背景下&#xff0c;低代码门户技术应运而生&#xff0c;为企业提供了一种新颖的应用开发方式。今天&#xff0c;我们将探讨低代码门户技术的基本概念、优势以及如何在实际应用中…

uni-app启动本地开发环境,修改默认端口号

vite.config.js: import { defineConfig } from "vite"; import uni from "dcloudio/vite-plugin-uni";// https://vitejs.dev/config/ export default defineConfig({server: {port: 3006,},plugins: [uni()], });人工智能学习网站 https://chat.xutong…

YoloV8实战:使用YoloV8实现OBB框检测

定向边框&#xff08;OBB&#xff09;数据集概述 使用定向边界框&#xff08;OBB&#xff09;训练精确的物体检测模型需要一个全面的数据集。本文解释了与Ultralytics YOLO 模型兼容的各种 OBB 数据集格式&#xff0c;深入介绍了这些格式的结构、应用和格式转换方法。数据集使…

【C++】list的使用和list的模拟实现和迭代器失效问题

一、list 的简单介绍 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向代。 2. list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向其前一个元素和后一个…

三级_网络技术_52_应用题

一、 请根据下图所示网络结构回答下列问题。 1.填写路由器RG的路由表项。 目的网络/掩码长度输出端口__________S0&#xff08;直接连接&#xff09;__________S1&#xff08;直接连接&#xff09;__________S0__________S1__________S0__________S1 2.如果在不改变路由表项…

npm install报错解决指南:清理缓存与重建依赖

问题描述 在执行npm install命令时&#xff0c;npm install报错&#xff0c;导致依赖无法正常安装。 具体步骤 清理npm缓存&#xff1a; 使用npm cache clean --force命令来强制清理npm缓存&#xff0c;以排除缓存导致的问题。 检查Node.js和npm版本&#xff1a; 执行node -v和…

面试经典算法150题系列-反转字符串中的单词

反转字符串中的单词 给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。 注意&#xff1a;输入字符串 s中可能…

HarmonyOS--合理使用动画

一、概述 动画是应用开发中必不可少的部分&#xff0c;它可以使应用程序更加生动和易于互动&#xff0c;一方面可以提升用户体验、增强视觉吸引力&#xff0c;另一方面可以引导用户操作、提高信息传达效率。应用程序中&#xff0c;页面层级间的转场、点击交互、手势操控都可以添…

一刷代码随想录(图论8)

拓扑排序 软件构建 题意&#xff1a; 题目描述&#xff1a; 某个大型软件项目的构建系统拥有 N 个文件&#xff0c;文件编号从 0 到 N - 1&#xff0c;在这些文件中&#xff0c;某些文件依赖于其他文件的内容&#xff0c;这意味着如果文件 A 依赖于文件 B&#xff0c;则必须…

Semantic Kernel/C#:一种通用的Function Calling方法,文末附经测试可用的大模型

Funcion Calling介绍 函数调用允许您将模型如gpt-4o与外部工具和系统连接起来。这对于许多事情都很有用&#xff0c;比如为AI助手赋能&#xff0c;或者在你的应用程序与模型之间建立深度集成。 如果您了解或者使用过Semantic Kernel可能会发现除了OpenAI支持Function Calling…