热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【C语言基础系列】运算符与表达式总结

写在前面:学习的第一门语言是Java,之前对C也了解一点,也只是了解一点,在加上长时间没有接触了,基本就只会一

写在前面:学习的第一门语言是Java,之前对C也了解一点,也只是了解一点,在加上长时间没有接触了,基本就只会一个Hello World了。现在由于准备升本考试,不得不从头开始学C。这里从零开始,记录C语言学习点滴。欢迎正在学习C语言的小伙伴一起学习,未来可期,一起加油!

前面几篇也讲述了部分运算符和表达式。比较零散,这里对运算符与表达式总结整理一下。

文章目录

      • 算术表达式
        • 1、算术运算符
        • 2、自增自减运算符
        • 3、 算术运算符的优先级
      • 赋值表达式
        • 1、赋值表达式
        • 2、复合赋值运算符
      • 关系表达式
        • 1、关系运算符
        • 2、关系表达式
      • 逻辑表达式
        • 1、逻辑运算符
        • 2、逻辑表达式
      • 条件表达式
        • 1、条件表达式
      • 逗号表达式
        • 1、逗号表达式
      • 其他运算
        • 1、长度运算
        • 2、特殊运算符




算术表达式


1、算术运算符

算术运算符分为单目运算符合双目运算符两类,单目运算符只需要一个操作数,而双目运算符需要两个操作数(下表为常用的算术运算符)。

目数单目单目单目单目双目双目双目双目双目
运算符++- -+-+-*/%
名称自增自减正值负值取余

2、自增自减运算符

自增自减运算都是对变量进行+1或者-1操作。
例如(n为变量):++n和n++都相当于n = n + 1;
–n和n–都相当于n = n - 1;
从上面案例中是不是觉得自增自减运算符放在变量前或后都是一样。单独做运算的确是一样的,但如果放在表达式中,就有区别了。
例如:

#includeint main(){int a = 1, b = 1, c = 3;a++;--b;/* a = 2, b = 0 */printf("a = %d, b = %d\n", a, b);a = 2;b = 2;/*先进行a * c运算,之后a在自增1*/printf("a++ * c = %d\n", a++ * c);/* b先自增1,在进行b * c运算 */printf("++b * c = %d\n", ++b * c);printf("a = %d, b = %d\n", a, b);return 0;
}

运行结果如下:
在这里插入图片描述
由上述案例可以清楚的看出,自增自减运算符单独做运算,运算符放在前后都是一样的。但如果放在表达式中。
如果自增自减运算符放在变量前面,则先自增或自减后在进行表达式运算。
如果自增自减运算符放在变量后面,则进行表达式运算在进行自增或自减。

3、 算术运算符的优先级

在算术四则运算中,需要遵循“先乘除后加减”的运算规则。同样,在计算表达式的值时,也需要按照运算符的优先级从高到低顺序计算。
例如:表达式a + b * c需要先计算b * c。因为 * 运算符的优先级高于 + 运算符。

如果操作数两侧运算符优先级相同,则按照“从左到右”的方向进行计算。
下表为部分运算符的优先级(从下到上,最上方的优先级最高)

运算符种类运算符
逻辑运算符!
算术运算符++、 - - 、+ 、- (单目)
算术运算符+、/ 、 % (双目)
算术运算符+ 、 - (双目)
关系运算符<、 <&#61; 、 > 、 >&#61;
关系运算符&#61; &#61; 、 ! &#61;
逻辑运算符&&、||
条件表达式&#xff1f;&#xff1a;
赋值运算符&#61; 、 &#43;&#61; 、-&#61; 、 *&#61; 、 /&#61; 、 %&#61;
逗号运算符,

上述的运算符优先级顺序为从下到上&#xff08;最上方的运算符优先级最高&#xff09;。上述运算符大部分之前都使用过&#xff0c;少部分没有见过的&#xff0c;下面会一一讲解。

赋值表达式

C语言将赋值作为一种运算&#xff0c;赋值运算符 &#61; 的左边必须是一个变量&#xff0c;作用是把一个表达式表达式的值赋给一个变量。

1、赋值表达式

用赋值运算符将一个变量和一个表达式链接起来的式子称为赋值表达式。赋值表达式的简单形式是&#xff1a;变量 &#61; 表达式

赋值表达式的运算过程&#xff1a;

  1. 计算赋值运算符右侧表达式的值。
  2. 将赋值运算符右侧表达式的值赋给赋值运算符左侧的变量。
  3. 将赋值运算符左侧的变量的值作为赋值表达式的值。

在赋值运算时&#xff0c;如果赋值运算符两侧的数据类型不同&#xff0c;在上述运算过程的第二步&#xff0c;系统首先会将赋值运算符右侧表达式的类型自动转换成赋值运算符左侧变量的类型&#xff0c;在给变量赋值&#xff0c;并将变量的类型作为赋值表达式的类型。
例如&#xff1a;

#includeint main(){int a &#61; 2, b, c &#61; 3;float f &#61; 1.2;b &#61; a * c; /* 将a*c的值赋给b------b &#61; 6 */printf("b &#61; %d\n", b);/* 将浮点型的 f 数据值赋值给b-----b &#61; 1 */b &#61; f;printf("b &#61; %d\n", b);return 0;
}

运行结果如下&#xff1a;
在这里插入图片描述

2、复合赋值运算符

赋值运算符分为简单的赋值运算符就是 &#61; (上述为简单的赋值运算符)&#xff0c;和复合赋值运算符&#xff0c;在&#61; 前加上算术运算符&#xff08;如下表&#xff09;。

运算符名词等价关系
&#43; &#61;加赋值a &#43;&#61; b 等价于 a &#61; a &#43; b
- &#61;减赋值a -&#61; b 等价于 a &#61; a - b
* &#61;乘赋值a *&#61; b 等价于 a &#61; a * b
/ &#61;除赋值a /&#61; b 等价于 a / &#61; b
% &#61;取余赋值a %&#61; b 等价于 a &#61; a % b

【注】b可以为变量也可以为表达式&#xff0c;表达式需要加括号。
例如&#xff1a;x *&#61; y -3等价于x &#61; x * (y - 3)

关系表达式


1、关系运算符

关系运算符是双目运算符&#xff0c;用于对两个操作数进行比较。关系运算符如下&#xff1a;

运算符<<&#61;>>&#61;&#61; &#61;! &#61;
名称小于小于或等于大于大于或等于等于不等于

关系运算符的优先级低于算术运算符&#xff0c;高于赋值运算符和逗号运算符(可以参考上面运算符优先级表)。
例如&#xff1a;假设a、b、c、d是整数变量&#xff0c;ch是字符型变量。则&#xff1a;

  1. a > b &#61;&#61; c 等价于&#xff08;a > b&#xff09;&#61;&#61; c。
  2. c &#61; a > b 等价于 c &#61; (a > b)。
  3. ch > ‘a’ &#43; 1 等价于 c&#61; &#xff08;‘a’ &#43; 1&#xff09;。
  4. d &#61; a &#43; b > c 等价于 d &#61; ((a &#43; b) > c)。
  5. 3 <&#61; a <&#61; 5 等价于&#xff08;3 <&#61; a&#xff09;<&#61; 5。
  6. b - 1 &#61;&#61; a !&#61; c 等价于 &#xff08;(b - 1) &#61;&#61; a&#xff09; !&#61; c。

2、关系表达式

用关系运算符将两个表达式链接起来的式子为关系表达式。关系表达式的值反映了关系运算(比较)的结果&#xff0c;它是一个逻辑量&#xff0c;取值“真”或“假”。整数 1 代表“真”&#xff0c;0代表“假”。类型都为整形。

关系表达式的运用&#xff0c;如下(一般运用在分支结构中)&#xff1a;

#includeint main(){char ch &#61; &#39;w&#39;;int a &#61; 2, b &#61; 3, c &#61; 1, d, x &#61; 10;/* 2 > 3 &#61;&#61; 1 结果为假&#xff0c;输出0 */printf("%d\t", a > b &#61;&#61; c);/* d &#61; 2 > 3 2 > 3为假&#xff0c;所以d&#61;0&#xff0c;输出0*/printf("%d\t", d &#61; a > b);/* ch > &#39;a&#39; &#43; 1 &#39;a&#39; &#43; 1 &#61; &#39;b&#39; &#39;w&#39; > &#39;b&#39; 结果为真&#xff0c;输出1*/printf("%d\t", ch > &#39;a&#39; &#43; 1);/* d &#61; 2 &#43; 3 > 1 b &#61; 5 > 1 结果为真&#xff0c;输出1 */printf("%d\t", d &#61; a &#43; b > c);/* 3-1 &#61;&#61; 2 !&#61; 1 2 &#61;&#61; 2 !&#61; 1 1 !&#61; 1 结果为假&#xff0c;输出0 */printf("%d\t", b - 1 &#61;&#61; a !&#61; c);/* 3 <&#61; 10 <&#61; 5 1 <&#61; 5 结果为真&#xff0c;输出1 */printf("%d\n", 3 <&#61; x <&#61; 5);return 0;
}

运行结果如下&#xff1a;
在这里插入图片描述
【注】因为关系表达式都属于同级&#xff0c;所以从左向右运行。

逻辑表达式


1、逻辑运算符

C语言中有三种逻辑运算符(如下表)&#xff0c;逻辑运算对象可以是关系表达式或逻辑量&#xff0c;逻辑运算的结果也是一个逻辑量&#xff0c;与关系运算一样&#xff0c;用整数 1 代表“真”&#xff0c;0 代表“假”。

目数单目双目双目
运算符&#xff01;&&||
名称逻辑非逻辑与逻辑或

假设 a 和 b 是逻辑量&#xff0c;则对 a 和 b 可以进行的基本逻辑运算包括 !a 或 !b、a && b 和 a || b 三种&#xff0c;具体运算值如下(1 表示 “真”&#xff0c;0 表示 “假”)&#xff1a;

ab!aa && ba || c
11011
10001
01101
00100

上述清楚地说明了逻辑运算符的功能&#xff0c;即&#xff1a;

  1. ! a&#xff1a;如果a为“真”&#xff0c;结果为0(“假”)&#xff1b;如果a为“假”&#xff0c;结果为1(“真”)。
  2. a && b&#xff1a;当a 和 b都为“真”时&#xff0c;结果为1(“真”)&#xff1b;否则&#xff0c;结果为0(“假”)。
  3. a || b&#xff1a;当a 和 b 都为“假”时&#xff0c;结果为0(“假”)&#xff1b;否则&#xff0c;结果为1(“真”)。

【注】同时使用逻辑表达式时**&&逻辑与的优先级要高于||逻辑或**。可以参考上面的游优先级表。

2、逻辑表达式

用逻辑运算符将关系表达式或逻辑量链接起来的式子为逻辑表达式。逻辑运算对象是值为“真”或“假”的逻辑量&#xff0c;可以是任何类型的数据&#xff0c;如整形、浮点型、字符型等。逻辑运算结果&#xff0c;同样也是1(“真”) 或 0(“假”)。

逻辑运算示例如下&#xff1a;

#includeint main(){char ch &#61; &#39;w&#39;;int a &#61; 2, b &#61; 0, c &#61; 0;float x &#61; 3.0;/* 2 && b 真 && 假 非0都为真&#xff0c;输出结果为0*/printf("%d\t", a && b);/* 2 || 0 && 0 结果为1 */printf("%d\t", a || b && c);/* !2 && 0 !取反&#xff01;的优先级比&&逻辑与高一些&#xff0c;结果为0 */printf("%d\t", !a && b);/* 2 || 13 && 2 结果为1 */printf("%d\t", a || 3&#43;10 && 2);/* !(3.0 &#61;&#61; 1) 结果为1 */printf("%d\t", !(x &#61;&#61; 1));/* !2 &#61;&#61; 2 结果为0 */printf("%d\t", !x &#61;&#61; 2);/* &#39;w&#39; || b &#39;w&#39;的值为正&#xff0c;结果为1 */printf("%d\n", ch || b);return 0;
}

运算结果如&#xff1a;
在这里插入图片描述

条件表达式


1、条件表达式

条件运算符是一个三目运算符&#xff0c;它将三个表达式链接在一起&#xff0c;组成条件表达式。条件表达式的一般形式为&#xff1a;
表达式1 &#xff1f; 表达式2 &#xff1a; 表达式3
条件表达式的运算过程是&#xff1a;先计算表达式1的值&#xff0c;如果他的值为非0&#xff08;真&#xff09;&#xff0c;将表达式2的值作为条件表达式的值&#xff0c;否则&#xff0c;将表达式3的值作为条件表达式的值。

例如&#xff1a;设a、b是整形变量&#xff0c;将a、b的最大值赋给z。可以用if语句实现&#xff1a;

if(a > b){z &#61; a;
}else {z &#61; b;
}

也可以用条件表达式来实现&#xff1a;

z &#61; &#xff08;a > b&#xff09;? a: b;

条件表达式在部分情况下&#xff0c;可以代替if语句。灵活的使用条件表达式&#xff0c;不但可以使程序简单明了&#xff0c;而且还能提高运算效率。

逗号表达式


1、逗号表达式

逗号既可以作分隔符&#xff0c;又可以作运算符。逗号作为分隔符使用时&#xff0c;用于间隔说明语句中的变量或函数中的参数&#xff0c;例如&#xff1a;

int a, b, c;
printf("%d %d", a, b);

逗号作为运算符使用时&#xff0c;将若干个独立的表达式链接在一起&#xff0c;组成逗号表达式。逗号表达式的一般形式为&#xff1a;
表达式1&#xff0c;表达式2&#xff0c;…&#xff0c;表达式n
逗号表达式的运算过程是&#xff1a;先计算表达式1的值&#xff0c;然后计算表达式2的值…最后计算表达式n的值&#xff0c;并将表达式n的值作为逗号表达式的值&#xff0c;将表达式n的类型作为逗号表达式的类型。

其他运算


1、长度运算

长度运算符sizeof是一个单目运算符。用来返回变量或数据类型的字节长度。
例如&#xff1a;设a是整形变量&#xff0c;则sizeof(a)计算整形变量a的长度&#xff0c;值为4(bytes)&#xff0c;sizeof(int)计算整形的长度&#xff0c;值为4(bytes)。可以用于计算数组长度&#xff0c;后面数组章节会详细讲解。

2、特殊运算符

在C语言中还有一些特殊的、具有专门用途的运算符。如(部分没有使用过&#xff0c;后面章节会详细讲解)&#xff1a;

  1. () 括号&#xff1a;用来改变运算符顺序。
  2. [] 下标&#xff1a;用来表示数组元素。
  3. *和 &&#xff1a;与指针运算有关。
  4. ->和 . :用来表示结构衡量。


由于初学C语言&#xff0c;上述内容如有错误地方&#xff0c;恳请各位大佬指出&#xff01;


推荐阅读
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • c语言\n不换行,c语言printf不换行
    本文目录一览:1、C语言不换行输入2、c语言的 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • C语言判断正整数能否被整除的程序
    本文介绍了使用C语言编写的判断正整数能否被整除的程序,包括输入一个三位正整数,判断是否能被3整除且至少包含数字3的方法。同时还介绍了使用qsort函数进行快速排序的算法。 ... [详细]
  • 使用C++编写程序实现增加或删除桌面的右键列表项
    本文介绍了使用C++编写程序实现增加或删除桌面的右键列表项的方法。首先通过操作注册表来实现增加或删除右键列表项的目的,然后使用管理注册表的函数来编写程序。文章详细介绍了使用的五种函数:RegCreateKey、RegSetValueEx、RegOpenKeyEx、RegDeleteKey和RegCloseKey,并给出了增加一项的函数写法。通过本文的方法,可以方便地自定义桌面的右键列表项。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 本文介绍了C函数ispunct()的用法及示例代码。ispunct()函数用于检查传递的字符是否是标点符号,如果是标点符号则返回非零值,否则返回零。示例代码演示了如何使用ispunct()函数来判断字符是否为标点符号。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
author-avatar
pacer猫处
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有