【Tutorial C】05 操作符 & 表达式
基本运算符
C使用运算符(operator)来代表算术运算。例如,+运算符可以使它两侧的值加在一起。
如果您觉得术语“运算符”听起来比较奇怪,那么请您记住那些东西总得有个名称。
与其被称之为“那些东西”或“数学符号”,被称之为“运算符”似乎看起来更专业一些!
现在,除此之外,让我们再看一下其他的基本运算符
赋值运算符
在C里,符号=不表示“相等”,而是一个赋值运算符。
下面的语句是将2014赋给num的变量。
num=2014;
也就是说,符号=的左边是一个变量名,右边是赋给该变量的值。
符号=被称为赋值运算符(assignment operator)。
再次强调不要把这行代码读做“num等于2014”,而应该读为“将值2014赋给变量num”。赋值运算符的动作是从右到左。
或许变量的名字和变量值之间的区别看起来微乎其微,但是请考虑下面的常量计算机语句:
i=i+1;
在数学上,该语句没有任何意义。如果您给一个有限的数加1,结果不会“等于”这个数本身。
它意味着“找到名字为i的变量的值:然后对那个值加1,然后将这个新值赋给名字为i的变量”。
像下面的这条语句:
2014=num;
在C中是没有意义的(确切的说是无效的),原因是2014只是一个常量。
您不能将一个值赋给一个常量;那个常量本身就是它的值了。
所以,当您准备键入代码时请记住在符号=左边的项目必须是一个变量的名字。
实际上,赋值运算符左边必须指向一个存储位置。
最简单的方法是使用变量的名字,但是以后您会看到,“指针”也可以指向一个存储位置。
更普遍地,C使用术语“可修改的左值”(modifiable Ivalue)来标志那些我们可以为之赋值的实体。
“可修改的左值”或许不是那么直观易懂,所以我们先看看一些定义。
几个术语:数据对象、左值、右值和操作数
“数据对象“(data object)是泛指数据存储区的术语,数据存储区能用于保存值。
例如,用于保存变量或数组的数据存储区是一个数据对象。C的术语左值(lvalue)指用于标识一个特定的数据对象的名字或表达式。
例如,变量的名字是一个左值。所以对象指的是实际的数据存储,但是左值是用于识别或定位那个存储的标识符。
因为不是所有的对象都是可更改值的,所以C使用术语”可修改的左值“来表示那些可以被更改的对象。
所以,赋值运算符的左值应该是一个可修改的左值。lvalue中的l确实是英文单词left的意思,因为可修改的左值可以用在赋值运算符的左边。
术语"右值"(rvalue)指的是能赋给可修改的左值的量。
例如,考虑下面的语句:
num=2014;
这里是一个可修改的左值,2014是一个右值。
您可能猜到rvalue中的r表示right。右值可以是常量、变量或者任何可以产生一个值的表达式。
我们可以把变量理解为一个容器,放在左边当左值时,意思为保存、存放右边的值。
所以,我们可以说=运算符的左操作数是可修改的左值。
数学运算符
主要包括:
单目运算符:只需要一个操作数
自增:++ 自减: --
双目运算符:需要两个操作数
加法:+ 减法:- 乘法: * 除法: / 求模:%
增量和减量运算符: ++和--
“增量运算符”(increment operator)完成简单的任务,即将其操作数的值增加1。
这个运算符以两种方式出现。在第一种方式中,++出现在它作用的变量的前面,这是前缀(prefix)模式.在第
二种方式中,++出现在它作用的变量的后面,这是后缀(postfix)模式。
这两种模式的区别在于值的增加这一动作发生的准确时间不同。
对于前缀运算符,先执行自增或自减运算,再计算表达式的值,而后缀运算符,则先计算表达式的值,再执行自增或自减运算。
我们通过例子来说明:
#include<stdio.h>
int main()
{
int a,b;
a=b=5;
printf("%d %d\n",a--,--b);
printf("%d %d\n",a--,--b);
printf("%d %d\n",a--,--b);
printf("%d %d\n",a--,--b);
printf("%d %d\n",a--,--b);
return 0;
}
这个程序5次将变量a和b减1,您可以通过这个结果来理解前缀和后缀的区别。
需要提醒一下的是,++与--是单目运算符,即一个操作对象,而这个操作对象只能为变量
因为,常量不可以被赋值。
样例
#include<stdio.h>
int main()
{
int a=20;
int b=5;
int c=6;
printf("a = %d b = %d c = %d\n",a,b,c);
printf("a + b = %d\n",a+b);
printf("a - c = %d\n",a-c);
printf("a * b = %d\n",a*b);
printf("a / c = %d\n",a/c);
printf("a %% c = %d\n",a%c);/*两个%才会输出一个%*/
return 0;
}
sizeof运算符
C中大约有40个运算符,其中有些运算符比其他运算符要常用的多。
我们前面已经讨论的那些是最常用的,现在我们将继续介绍几个比较有用的运算符。
常年被人误认为函数的关键字"sizeof"
sizeof是C语言的32个关键字之一,并非“函数”(我们会后面介绍),也叫长度(求字节)运算符,
sizeof是一种单目运算符,以字节为单位返回某操作数的大小,用来求某一类型变量的长度。
其运算对象可以是任何数据类型或变量。
样例:
#include<stdio.h>
int main()
{
int n=0;
int intsize = sizeof(int);
printf("int sizeof is %d bytes\n",intsize);
return 0;
}
三目运算符
下面给大家介绍一下三目运算符
首先介绍一个概念,所谓的“目”是指这个运算符参与运算的对象个数
比如前面我们介绍了+、-、*、\等等运算符,这些需要两个数或者变量运算,所以就属于双目运算符;
而++和--一个对象就可以组合,这种就是单目运算符,很好理解,
那么今天所提到的三目,当然就是有三个对象参与运算了!
这可是C语言当中唯一一个三目运算符哦,就是选择运算符
它的一般形式是通过?和:两个符合组合而成的,一般形式如下:
表达式1?表达式2:表达式3
什么意思呢,首先会计算表达式1的值,看看是真还是假,也就是成立还是不成立,
如果表达式1成立,那么这个三目运算符整体的值呢就是表达式2的值,
否则(也就是表达式1不成立),这个三目运算符整体的值就是表达式3的值。
怎么样,看明白了吗? 下面举个例子说明一下:
2>1?10:20
这个表达式整体的值是几呢,答案应该是10,应为2>1成立,
因此它的值就是表达式2的值!就是10
int a=3,b=5;
int c=10;
c?:(a+b):(a-b)
这个表达式的值呢,大家先算算,应该是8,为什么呢,
因为表达式1也就是c的值(10)为真,所以就是表达式2的值也就是a+b就是8。
这下大家明白了吧!
这就是三目运算符的用法,大家可以理解一下!
其实本质上是一种选择结构,根据表达式1的成立与否,决定是表达式2还是表达式3,
大家理解一下然后上机实验一下!
表达式和语句
在此之前,我们多次用到了术语表达式和语句,现在我们需要深刻的理解他们了,语句是组成C的基本单位,并且大多数语句由表达式构成。
所以,我们有必要对表达式进一步学习。
表达式
表达式(expression)是由运算符和操作数组合构成的(回忆一下,操作数是运算符操作的对象)。
最简单的表达式即一个单独的操作数,以此作为基础可以建立复杂的表达式,
比如下面这些:
3+2 a=(2+b/3)/5 x=i++ m=2*5
正如您看到的一样,操作数可以是常量,也可以是变量,亦可以是他们的组合。
一些表达式是多个较小的表达式的组合,这些小的表达式称为子表达式(subexpression)。
每个表达式都有一个值
C中一个重要的属性是每一个C表达式都有一个值。
为了得到这个值,您可以按照运算服优先级描述的顺序来完成运算。
我们所列出的前几个表达式的值都很明显,但是有=的表达式的值是什么呢?
那些表达式与=左边的变量取得的值相同。
所以,表达式m=2*5作为一个表达式,其整体的值为10。
语句
语句(statement)是构造程序的基本部分。
程序(program)是一系列带有某种必须的标点语句集合。
一个语句是一条完整的计算机指令。
在C中,语句用结束处的一个分号标示。
c=3
这只是一个表达式(它可能是一个较大语句的一个部分),而c=3;则是一个语句。
想必您应该已经看到了,没错,表达式后面加一个分号即构成了一条C语句(它们被称为表达式语句)。
所以,C不反对像下面的语句:
1;
2+2;
https://www.dotcpp.com/course/20
【Tutorial C】05 操作符 & 表达式的更多相关文章
- MongoDB中“$”操作符表达式汇总
MongoDB中"$"操作符表达式汇总 查询 比较操作 $eq 语法:{ : { $eq: } } 释义:匹配等于(=)指定值的文档 举例: 查询age = 20的文档: db.p ...
- C语言操作符/表达式及其作用总结
一.算术操作符:+ - * / % 1. 除了 %操作符之外,其他的 几个操作符可以作 用于整数和浮点数. 2. 对于"/"操作符如果两个操作数都为整数,执行整数除法.而只要有浮点 ...
- MongoDB学习3 $操作符表达式大全及实例
from : http://blog.csdn.net/qq_16313365/article/details/58599253 1.查询和投影 1.1 比较操作符 $eq 语法:{ <fi ...
- [05] EL表达式
1.概述 EL = Expression Language 表达式语言,用来在JSP中替代<%=%>的数据表达方式,EL更简洁,它的语法如下: ${...} 1 1 ${...} ...
- C#3.0新增功能10 表达式树 05 解释表达式
连载目录 [已更新最新开发文章,点击查看详细] 表达式树中的每个节点将是派生自 Expression 的类的对象. 该设计使得访问表达式树中的所有节点成为相对直接的递归操作. 常规策略是从根节点 ...
- 【.net 深呼吸】细说CodeDom(2):表达式、语句
在上一篇文章中,老周厚着脸皮给大伙介绍了代码文档的基本结构,以及一些代码对象与CodeDom类型的对应关系. 在评论中老周看到有朋友提到了 Emit,那老周就顺便提一下.严格上说,Emit并不是针对代 ...
- LINQ to Entity Framework 操作符(转)
在开始了解LINQ to Entities之前,需要先对.NET Framework 3.5版本后对C#语言的几个扩展特性做一些阐释,这有助于我们更容易.更深刻的理解LINQ to Entities技 ...
- 深入浅出数据结构C语言版(8)——后缀表达式、栈与四则运算计算器
在深入浅出数据结构(7)的末尾,我们提到了栈可以用于实现计算器,并且我们给出了存储表达式的数据结构(结构体及该结构体组成的数组),如下: //SIZE用于多个场合,如栈的大小.表达式数组的大小 #de ...
- C# - 表达式与语句
表达式与语句(Expression&Statement) 操作数(Operands) 1.数字.2.字符.3.变量.4.类型.5.对象.6.方法 操作符(Operator) 参考:C# - 操 ...
- 项目期复习:JS操作符,弹窗与调试,凝视,数据类型转换
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/huangyibin628/article/details/26364901 1.JS操作符 ① 除法 ...
随机推荐
- 鼠标悬浮显示鼠标停留数据的内容 elementui + vue
先看效果图 直接上代码 <el-tabs v-model="activeName" @tab-click="handleClick"> <el ...
- 3代 I3 3220 对比12代 G6900 测试 入手 上手 评测
3代 I3 3220 对比12代 G6900 测试 入手 上手 评测 I3 3220 的CPU-Z ,和cinebench r23 跑分. G6900 的CPU-Z ,和cinebench r23 跑 ...
- 编程语言界的丐帮 C#.NET 国密数字信封 民生银行
民生银行的库DLL只有C版本和JAVA版本.按着JAVA版本做的C# 实现. 重点内容. 1.数字信封就是 CmsEnvelopedData Der编码后转BASE64 2.重点类:ContentIn ...
- 论文阅读 《Pingmesh: A Large-Scale System for Data Center Network Latency Measurement and Analysis》
背景 在我们内部产品中,一直有关于网络性能数据监控需求,我们之前是直接使用 ping 命令收集结果,每台服务器去 ping (N-1) 台,也就是 N^2 的复杂度,稳定性和性能都存在一些问题,最近打 ...
- windows rabbitmq安装
windows rabbitmq安装1.环境变量,关键是rabbitmq_server需要与erlang版本对应,否则无法使用. rabbitmq下载页https://github.com/rabbi ...
- 【解决方案】Java 互联网项目中消息通知系统的设计与实现(上)
目录 前言 一.需求分析 1.1发送通知 1.2撤回通知 1.3通知消息数 1.4通知消息列表 二.数据模型设计 2.1概念模型 2.2逻辑模型 三.关键流程设计 本篇小结 前言 消息通知系统(not ...
- hdu4135题解 容斥
Problem Description Given a number N, you are asked to count the number of integers between A and B ...
- Atcoder Beginner Contest 324 G Generate Arrays 题解-Treap
为了更好的阅读体验,请点击这里 题目链接 套上平衡树板子就能做的很快的题,然后因为是指针存树,因此交换只需要把序列大小较小的挨个拿出来插到相应的地方即可.复杂度 \(O(N \log^2 N)\). ...
- python提取特定格式的数据
Excel Grid Data Converter 知识点总结 本文档总结了 ExcelGridConverter.py 脚本所涉及的关键 Python 知识点.该脚本用于从多个 Excel 文件中提 ...
- W801单片机入门开发环境设置
W801单片机入门开发环境设置 开发软件下载 烧录工具和SDK 在 WinnerMicro的网站 https://www.winnermicro.com/html/1/156/158/558.html ...