C 语言编程 — 运算符
目录
前文列表
《程序编译流程与 GCC 编译器》
《C 语言编程 — 基本语法》
《C 语言编程 — 基本数据类型》
《C 语言编程 — 变量与常量》
运算符
运算符是一种告诉编译器执行特定的算数或逻辑操作的符号。
- 操作对象:又称操作数,是参与计算求值的最小数据单元。操作数可以为常量、变量、函数等。
- 表达式:用运算符将操作对象连接起来可以构成表达式。表达式是用于计算的式子,是计算求值的基本单位。
- 优先级:高优先级的运算符先进行运算,低优先级的运算符后进行运算。
- 结合性:决定了运算符的运算方向。
- 左结合性:当运算符为从左到右进行运算,那么称这个运算符为左结合性运算符
- 右结合性:当运算符为从右到左进行运算,那么称这个运算符为右结合性运算符
NOTE:
- 当一个表达式中出现多个运算符时,需要考虑运算符的优先级和结合性是否影响表达式的求值顺序。
- 当两个运算符相同优先级时,由运算符的结合性来决定运算顺序。
- 在表达式中使用圆括号
()
可以改变表达式的运算顺序。
算数运算符
NOTE:求余运算符的操作数只可以为整型。
自增、自减运算符
- i++ :先取值,后自加。使用 i 之后,
i=i+1
- ++i :先自加,后取值。
i=i+1
后,再使用 i - i- - :先取值,后自减。使用 i 之后,
i=i-1
- -i :先自减,后取值。
i=i-1
后, 再使用 i
- -i :先自减,后取值。
NOTE:自增运算符和自减运算符的操作数只可以为变量,不能为常量或表达式。
比较运算符
假设变量 A 的值为 10,变量 B 的值为 20,则:
NOTE:比较表达式的运算结果值是 0(假)或 1(真)。C 语言没有 bool 类型,用整数值 0 来表示假,用非 0 值来表示真 。C++ 为提高程序的可读性引入了 bool 类型,bool 类型变量的值为 true 或 false。C++ 为了保持对 C 语言的兼容性,false 用 0 来表示,ture 用 1 来表示。
逻辑运算符
逻辑表达式:用逻辑运算符将操作对象连接起来的式子,称为逻辑表达式。
假设变量 A 的值为 1,变量 B 的值为 0,则:
NOTE:当逻辑表达式中同时出现多种运算符时,按下列顺序进行运算:算术运算→关系运算→逻辑运算。
位运算符
位运算符作用于位,并逐位执行操作。&(全一则一)、|(有一则一)、^(异或)、~(取反)的真值表如下所示:
假设如果 A = 60,且 B = 13,现在以二进制格式表示,它们如下所示:
A = 0011 1100
B = 0000 1101
- A&B = 0000 1100
- A|B = 0011 1101
- A^B = 0011 0001
- ~A = 1100 0011
赋值运算符
赋值运算表达式:用赋值运算符将变量和表达式连接起来的式子,称为赋值运算表达式。
多重赋值: V1=V2=...=Vn=
表达式。执行时,从右到左把表达式的值按照 Vn、… 、V2、V1 的顺序依次赋给每个变量。
赋值运算符可分为:
- 基本赋值运算符: = 将一个数据赋给一个变量功能的运算符。
- 复合赋值运算符:基本赋值运算符与算术运算符、位运算符等组成复合赋值运算符。
NOTE:
- 赋值运算符的左侧必须为变量名,右侧必须为表达式。
- 赋值运算表达式的值为赋值运算符左侧变量的数据值。
- 赋值运算表达式的数据类型为左侧变量的数据类型。
- 当出现右侧表达式的数据类型与左侧变量的数据类型不一致时,则会先把右边表达式的值进行强制数据类型转换后,再进行赋值。
逗号运算符
逗号运算符:又称为顺序求值运算符,功能是将表达式连接起来,从左向右求解各个表达式,逗号运算的值为最后的表达式 n 的值。
NOTE:逗号运算符的优先级最低,引入逗号表达式的目的是为了简化程序书写。
// C/C++ 按顺序计算表达式 1,表达式 2, .....,表达式 n 的值
// 整个逗号表达式的值为表达式 n 的值
表达式1, 表达式2, 表达式3, ......, 表达式n
sizeof 运算符
sizeof 运算符:求某一数据类型或某一变量在内存空间中所占空间的字节数。
sizeof(变量名或数据类型)
e.g.
int main()
{
char stringA[] = "Hello World!\r\n";
printf(" sizeif( char ) = %d\r\n", sizeof(char));
printf(" sizeif( int ) = %d\r\n", sizeof(int));
printf(" sizeif( long int ) = %d\r\n", sizeof(long int));
printf(" sizeif( float ) = %d\r\n", sizeof(float));
printf(" sizeif( double ) = %d\r\n", sizeof(double));
// 注意 stringA 的末尾还存放着 '\0'
printf(" sizeif( stringA ) = %d\r\n", sizeof(stringA)/sizeof(char));
return 0;
}
杂项运算符
包括 &(地址运算符)、*(指针运算符)、?:(三元运算符)。
#include <stdio.h>
int main(){
int a = 4;
short b;
double c;
int * ptr;
printf("a: %lu\n", sizeof(a));
printf("b: %lu\n", sizeof(b));
printf("c: %lu\n", sizeof(c));
ptr = &a;
printf("*ptr: %d\n", *ptr);
return 0;
}
运行:
# ./main
a: 4
b: 2
c: 8
*ptr: 4
注意:局部变量 ptr 被定义为指针类型,所以 ptr 可以存储变量的 “指针”,即变量的值在内存中的入口地址。ptr = &a;
存储了局部变量 a 的地址,再通过指针运算符 * 将局部变量 a 的值取出来。
- 指针变量:存储的内存地址。
- 将变量/函数的内存地址赋值给指针变量。
- 通过指针运算符将指针变量储存的内存地址所指向的值取出来。
运算符的优先级
较高优先级的运算符出现在表格的上面,具有较低优先级的运算符出现在表格的下面。在表达式中,较高优先级的运算符会优先被计算。
C 语言编程 — 运算符的更多相关文章
- 个人c语言编程风格总结
总结一下我个人的编程风格及这样做的原因吧,其实是为了给实验室写一个统一的C语言编程规范才写的.首先声明,我下面提到的编程规范,是自己给自己定的,不是c语言里面规定的. 一件事情,做成和做好中间可能隔了 ...
- 第二章 C语言编程实践
上章回顾 宏定义特点和注意细节 条件编译特点和主要用处 文件包含的路径查询规则 C语言扩展宏定义的用法 第二章 第二章 C语言编程实践 C语言编程实践 预习检查 异或的运算符是什么 宏定义最主要的特点 ...
- R语言编程艺术(4)R对数据、文件、字符串以及图形的处理
本文对应<R语言编程艺术> 第8章:数学运算与模拟: 第10章:输入与输出: 第11章:字符串操作: 第12章:绘图 =================================== ...
- R语言编程艺术(3)R语言编程基础
本文对应<R语言编程艺术> 第7章:R语言编程结构: 第9章:面向对象的编程: 第13章:调试 ============================================== ...
- R语言编程艺术(2)R中的数据结构
本文对应<R语言编程艺术>第2章:向量:第3章:矩阵和数组:第4章:列表:第5章:数据框:第6章:因子和表 ======================================== ...
- C++语言编程规范
前言 这里参考了<高质量C++C 编程指南 林锐>.<google C++编程指南>以及<华为C++语言编程规范>编写了这份C++语言编程规范文档,以合理使用 C+ ...
- c语言编程基础入门必备知识
数据类型 基本数据类型 类型名称说明char字符类型存放字符的ASCII码int整型存放有符号整数short短整型存放有符号整数long长整型存放有符号整数long long存放有符号整数float单 ...
- C语言编程实现Linux命令——who
C语言编程实现Linux命令--who 实践分析过程 who命令是查询当前登录的每个用户,它的输出包括用户名.终端类型.登录日期及远程主机,在Linux系统中输入who命令输出如下: 我们先man一下 ...
- Linux下C语言编程实现spwd函数
Linux下C语言编程实现spwd函数 介绍 spwd函数 功能:显示当前目录路径 实现:通过编译执行该代码,可在终端中输出当前路径 代码实现 代码链接 代码托管链接:spwd.c 所需结构体.函数. ...
- 混合语言编程:启用CLR(公共语言运行时编译)让C#调用C++
前言 关于混合C#和C++的编程方式,本人之前写过一篇博客(参见混合语言编程:C#使用原生的Directx和OpenGL),在之前的博客中,介绍了在C#的Winform和WPF下使用原生的Direct ...
随机推荐
- CSP-S初赛知识点(持久更新)
先更新这么多,以后再说吧 AK IOI 排序算法 算法名称 平均复杂度 最好情况 最坏情况 空间复杂度 排序方式 稳定性 冒泡排序 \(O(N^2)\) \(O(N)\) \(O(N^2)\) \(O ...
- BiLSTM算法(一)
原理分析: BiLSTM(双向长短期记忆网络) 是一种循环神经网络(RNN)的变体,它在自然语言处理任务中非常有效,其中包括给定一个长句子预测下一个单词. 这种效果的主要原因包括以下几点: 长短期记忆 ...
- 新一期HarmonyOS认证正式发布,速来围观!
原文:https://mp.weixin.qq.com/s/mvXLnJM9VKTyq8mi9BfY1w,点击链接查看更多技术内容. 华为认证HarmonyOS应用开发高级工程师HCIP-Harm ...
- mysql 重新整理——sql 执行语句的顺序[五]
前言 盗图: 其实在复杂的语句中,需要我们逐步去分析,然后呢,我们了解一些优化器到底是如何帮我们优化的,就知道到底是mysql怎么执行代码. 我把以前的丢了,后续补全.
- jenkins 持续集成和交付——maven小栗子(四)
前言 因为前面一节中介绍了自由风格模式,这里介绍一个专门为maven打造的模式,没错就是使用插件.这里写这个只是为了说明,如果我们构建一些不是那么复杂的项目,那么可以去使用一些插件,这样可以更加方便, ...
- hashchang事件是异步更新的
1.代码 // 此时会触发hashchange location.hash = '/test' window.addEventListener('hashchange', () => { con ...
- 力扣1127(MySQL)-用户购买平台(困难)
题目: 支出表: Spending 这张表记录了用户在一个在线购物网站的支出历史,该在线购物平台同时拥有桌面端('desktop')和手机端('mobile')的应用程序.这张表的主键是 (user_ ...
- 阿里云安全运营中心:DDoS攻击趁虚而入,通过代理攻击已成常态
应用层DDoS攻击与传统的DDoS攻击有着很大不同.传统的DDoS攻击通过向攻击目标发起大流量并发式访问造成服务不可用,系统瘫痪,这种方式比较容易被识破,且市场上已经有成熟的应对方案.而近年来兴起的应 ...
- 使用AnalyticDB轻松实现以图搜图和人脸检索
1. 背景 以图搜图在生活中有着广泛的应用, 当我们在电视上看到有人穿着一件美丽的裙子或者帅气的球鞋也想拥有时, 我们可以拍张照片然后打开淘宝然后上传照片就可以快速的找到这个商品. 我们看到一张电影截 ...
- [Mobi] Android Studio arm 模拟器
从右下角 Configure 打开 AVD Manager. 点击 "Create New Device" 来创建新设备 选择TV 接着Next,然后用 Other Imag ...