C语言常见语法——运算符和表达式
自增,自减运算符使用注意及案例
1.++i , --i (在使用 i 之前,先使 i 的值加(减) 1)
2.i++ , i-- (在使用 i 之后,先使 i 的值加(减) 1)
3.int i=3;
int i=3,j;
j = ++i;// i 的值先变成 4,再赋给j,j的值为4
j = i++;// 先将 i 的值3赋给 j,j的值为 3,然后 i变成4
又如:
i=3;
printf("%d",++i); //输出 4
//若是
printf("%d\n",i++); //输出 3
4.注意
- 自增运算符(++)和自减运算符(--)只能用于变量;
- 错误表示:5++,(a+b)++;都是错误表达,因为最后得到的结果,没有变量可供存放;
- 表达式k=-i++等效于k=(-i)++还是k=-(i++)因为负号运算符和自增运算符优先级相同,哪一个正确就得看结合方向。
- 自增、自减运算符及负号运算符的结合方向是从右向左。因此,上式等效于k=-(i++);若i=5,则表达式k=-i++运算之后k的值为-5,i的值为6。此赋值表达式的值即为所赋的值-5。不要因为k=-i++等效于k=-(i++)就先做“++”运算!这里采用的是“先用后变”,即先拿出i的值做负号“-”运算,把这个值赋给变量k之后变量i才自增。
5.结合上面的基本要求和注意事项,来看“先变后用”还是“先用后变” 案例:
变量 j的值都是在 i=3,k=1的前提下求出的:
后缀运算:
(1)j=(5,6,(i++)+(i++)+(i++)): j=9(3+3+3)
(2)j=(k++,6,(i++)+(i++)+(i++)): j=9(3+3+3)
(3)j=1?(i++)+(i++)+(i++): 0: j=9(3+3+3)
(4)j=i?(i++)+(i++)+(i++): 0: j=12(3+4+5)
(5)j=k++?(i++)+(i++)+(i++): 0: j=12(3+4+5)
前缀运算:
(6)j=(5,i,(++i)+(++i)+(++i)): j=18(6+6+6)
(7)j=(5,k++,(++i)+(++i)+(++i)): j=15(4+5+6)
(8)j=1?(++i)+(++i)+(++i): 0: j=18(6+6+6)
(9)j=1?(k++,(+i)+(++i)+++i)): 0: j=15(4+5+6)
(10)j=k++?(++i)+(++i)+(++i): 0: j=15(4+5+6)
理解上述式子用到的知识:
(1)逗号表达式:
逗号运算符是所有运算符中级别最低的。因此,下面两个表达式的作用是不同的:
① x=(a=3,6*3)
② x=a=3,6*a
第①个是一个赋值表达式,将一个逗号表达式的值赋给x,x的值等于18。第②个是逗号表达式,它包括一个赋值表达式和一个算术表达式,x的值为3。
(2)三目运算符(结合方向,右到左)
一般形式为:
表达式1? 表达式2: 表达式3
其求值规则为:如果表达式1的值为真,则以表达式2 的值作为条件表达式的值,否则以表达式2的值作为整个条件表达式的值。
6.作为初学者,写自增,自减运算符时要特别注意使用的细节;看大佬写的代码,做题时,要认真分析逻辑关系,自增自减运算符与其他运算符相结合,注意优先级,还有要从右向左计算。
7.C语言运算符优先级表
- C语言中,运算符的运算优先级共分为15 级。
- 1 级最高,15级最低。
- 在表达式中,优先级较高的先于优先级较低的进行运算。
- 而在一个运算量两侧的运算符优先级相同时,则按运算符的结合性所规定的结合方向处理。
- 运算符的结合性:C语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结合性(自右至左)。
- 例如算术运算符的结合性是自左至右,即先左后右。如有表达式x-y+z 则y 应先与“-”号结合,执行x-y 运算,然后再执行+z 的运算。这种自左至右的结合方向就称为“左结合性”。而自右至左的结合方向称为“右结合性”。
- 最典型的右结合性运算符是赋值运算符。如x=y=z,由于“=”的右结合性,应先执行y=z 再执行x=(y=z)运算。
- C语言运算符中有不少为右结合性,应注意区别,以避免理解错误。
说明:
同一优先级的运算符,运算次序由结合方向所决定。
简单记就是:! > 算术运算符 > 关系运算符 > && > || >赋值运算符
优先级 | 运算符 | 名称或含义 | 使用形式 | 结合方向 | 说明 |
1 | [] | 数组下标 | 数组名[常量表达式] | 左到右 | |
() | 圆括号 | (表达式)/函数名(形参表) | |||
. | 成员选择(对象) | 对象.成员名 | |||
-> | 成员选择(指针) | ||||
2 | - | 负号运算符 | -表达式 | 右到左 | 单目运算符 |
(类型) | 强制类型转换 | (数据类型)表达式 | |||
++ | 自增运算符 | ++变量名/变量名++ | 单目运算符 | ||
-- | 自减运算符 | --变量名/变量名-- | 单目运算符 | ||
* | 取值运算符 | *指针变量 | 单目运算符 | ||
& | 取地址运算符 | &变量名 | 单目运算符 | ||
! | 逻辑非运算符 | !表达式 | 单目运算符 | ||
~ | 按位取反运算符 | ~表达式 | 单目运算符 | ||
sizeof | 长度运算符 | sizeof(表达式) | |||
3 | / | 除 | 表达式/表达式 | 左到右 | 双目运算符 |
* | 乘 | 表达式*表达式 | 双目运算符 | ||
% | 余数(取模) | 整形表达式%整形表达式 | 双目运算符 | ||
4 | + | 加 | 表达式+表达式 | 左到右 | 双目运算符 |
- | 减 | 表达式-表达式 | 双目运算符 | ||
5 | << | 左移 | 变量<<表达式 | 左到右 | 双目运算符 |
>> | 右移 | 变量>>表达式 | 双目运算符 | ||
6 | > | 大于 | 表达式>表达式 | 左到右 | 双目运算符 |
>= | 大于等于 | 表达式>=表达式 | 双目运算符 | ||
< | 小于 | 表达式<表达式 | 双目运算符 | ||
<= | 小于等于 | 表达式<=表达式 | 双目运算符 | ||
7 | == | 等于 | 表达式==表达式 | 左到右 | 双目运算符 |
!= | 不等于 | 表达式!=表达式 | 双目运算符 | ||
8 | & | 按位与 | 表达式&表达式 | 左到右 | 双目运算符 |
9 | ^ | 按位异或 | 表达式^表达式 | 左到右 | 双目运算符 |
10 | | | 按位或 | 表达式|表达式 | 左到右 | 双目运算符 |
11 | && | 逻辑与 | 表达式&&表达式 | 左到右 | 双目运算符 |
12 | || | 逻辑或 | 表达式||表达式 | 左到右 | 双目运算符 |
13 | ?: | 条件运算符 | 表达式1?表达式2:表达式3 | 右到左 | 三目运算符 |
14 | = | 赋值运算符 | 变量=表达式 | 右到左 | |
/= | 除后赋值 | 变量/=表达式 | |||
*= | 乘后赋值 | 变量*=表达式 | |||
%= | 取模后赋值 | 变量%=表达式 | |||
+= | 加后赋值 | 变量+=表达式 | |||
-= | 减后赋值 | 变量-=表达式 | |||
<<= | 左移后赋值 | 变量<<=表达式 | |||
>>= | 右移后赋值 | 变量>>=表达式 | |||
&= | 按位与后赋值 | 变量&=表达式 | |||
^= | 按位异或后赋值 | 变量^=表达式 | |||
|= | 按位或后赋值 | 变量|=表达式 | |||
15 | , | 逗号运算符 | 表达式,表达式…… | 左到右 | 从左到右顺序运算 |
C语言常见语法——运算符和表达式相关推荐
- 51单片机c语言除法符号,51单片机之C语言-4.4运算符及表达式
原标题:51单片机之C语言-4.4运算符及表达式 4.4 及 前面三节实际是讲如何定义一个数据类型,所谓数据类型其实就是不同存储空间的形状,也就是不同单元格的组合方式.既然定义了数据类型,我们的目的当 ...
- 信工干货||C语言中的运算符和表达式
C语言中的运算符和表达式 1算术运算符及表达式 (1)算术运算符包括: ,-,*,/,%. (2)*,/,%同级,比 ,-高. (3)"%"运算符两侧的运算分量必须为整型数据,且运 ...
- C语言数据类型、运算符、表达式
数据类型.运算符.表达式 常量:在程序运行中,其值不能被改变的量就叫常量. 150; //整型常量 12.3; //实型常量(浮点型常量),带小数点的 'a'; //用单引号引起来的 ...
- Chapter Two : Python 语言基础、运算符与表达式、程序的控制结构合集
目录 一.Python 语言基础 1. Python 语法规则 2. 关键字与标识符 3. 变量 4. 基本数据类型 5. 输入与输出 二.运算符与表达式 1. 算术运算符 2. 赋值运算符 3. 比 ...
- c语言表达式用法,C语言开发之运算符、表达式用法
C语言中运算符和表达式数量之多,在高级语言中是少见的.正是丰富的运算符和表达式使C语言功能十分完善.这也是C语言的主要特点之一.C语言的运算符不仅具有不同的优先级,而且还有一个特点,就是它的结合性.在 ...
- 2、C语言面试笔试---运算符和表达式
文章目录 背景 1.运算符和表达式 1.1自增自减运算符++与-- 1.2 C语言符号的优先级 1.3 类型转换 1.4 顺序点的概念 1.5 贪心法 2.面试笔试例题 背景 1.运算符和表达式 1. ...
- C语言再学习 -- 运算符与表达式
分三部分来讲 一.左值与右值 参看:左值与右值 首先我们需要理解左值和右值的定义: 左值指的是如果一个表达式可以引用到某一个对象,并且这个对象是一块内存空间且可以被检查和存储,那么这个表达式就可以做为 ...
- 一文带你回顾go语言常见语法现象
前言 一门语言中的语法现象都是固定的,基础语法几乎都差不多,本篇文章涉及到go入门脚本,变量,条件语句,函数等语法现象的案例, 用一篇文章梳理go基础中可能出现的所有语言现象. 先从宏观上了解一些语法 ...
- 六、C语言中的运算符与表达式
一.算术运算符与算术表达式 (一)算术运算符 1.基本的算术运算符: + 加法运算符或正值运算符 - 减法运算符或负值运算符 * 乘法运算符 / 除法运算符,整数与整数相除结果为整数,且多数C编译系统 ...
最新文章
- 30 岁码农人生:人生至暗时,你依然能窥见光明
- 01_NumPy介绍,什么是NumPy,Python应用、(NumPy、SciPy、Matplotlib相关网址)--来自菜鸟和NumPy中文网
- Android PDU
- laradoc mysql acccess_安装之后,启动mysql容器失败
- 如何成为数据科学家_成为数据科学家的5大理由
- Appium环境搭建-完整版
- 聊聊安卓折叠屏给交互设计和开发带来的变化
- C语言程序设计基础练习题
- 正弦信号发生器设计——VHDL
- linux内核 3.1,快更新:Linux新内核发布 支持USB3.1!
- jquery ajax示例_jQuery AJAX JSP Servlet Java示例
- 基于SSM的旅游管理系统
- resnet的演化(res2net,resnext,se-resnet,sk-resnet,resnest)
- 校园网络登陆显示通信服务器异常,校园网络监控技术方案设计.docx
- 论文管理软件 Zotero 备忘
- pbs分解_谈WBS与PBS
- Typora修改空格样式(blockquote)
- 【MATLAB编程实例练习】-(34)直角三角形边长问题
- 机器学习中训练集、验证集和测试集的作用
- 数学建模竞赛常用软件培训2