运算符和表达式

1.基本运算符

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 4

4 3

3 2

2 1

1 0

这个程序5次将变量a和b减1,您可以通过这个结果来理解前缀和后缀的区别。 需要提醒一下的是,++与--是单目运算符,即一个操作对象,而这个操作对象只能为变量,因为,常量不可以被赋值。

运算符

符号

操作

用例

结果

加法

+

使它两侧的值加到一起

1+2

3

减法

-

从它前面的数减去后面的数

5-3

2

乘法

*

将它前面的数乘以后面的数

2*3

6

除法

/

用它左边的值除以右边的值

8/3

2(整数的除法会丢掉小数部分)

取模

%

求用它左边的值除以右边的数后的余数

5%3

2(%运算符两侧的操作数必须为整数)

看一个例子:

#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;

}

运行结果为:

a = 20 b = 5 c = 6

a + b = 25

a - c = 14

a * b = 100

a / c = 3

a % c = 2

请大家亲自实验。

2. 其他运算符

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;

}

在32位操作系统下,运行结果如下:

int sizeof is 4 bytes

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;

但这样的语句对程序没有任何意义。


原文发布于微信公众号 - 编程范(dotcpp)

原文发表时间:2015-12-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器学习算法工程师

客官,来嘛,谷歌小菜请你尝尝!

作者:柳行刚 编辑:王抒伟 谷歌面试题 等你来挑战 详情往下看 各位,看招 1 题目描述: 一个大小为n的数组,里面的数都属于范围[0, n-1],有不确定的重...

30480
来自专栏程序员互动联盟

【编程基础】C++ Primer快速入门之七:运算符

一、表达式的定义 什么是表达式?表达式,是由数字、运算符、数字分组符号(括号)、自由变量和约束变量等以能求得数值的有意义排列方法所得的组合(1)。1 + 2是个...

31740
来自专栏转载gongluck的CSDN博客

python笔记:#008#变量的命名

变量的命名 目标 标识符和关键字 变量的命名规则 0.1 标识符和关键字 1.1 标识符 标示符就是程序员定义的 变量名、函数名 名字 需要有 见名知义 的...

37840
来自专栏互联网杂技

排序算法性能比较

所谓排序,即将原来无序的一个序列重新排列成有序的序列。 排序方法中涉及到稳定性,所谓稳定性,是指待排序的序列中有两个或两个以上相同的项,在排序前和排序后看这些相...

38370
来自专栏游戏开发那些事

【Cocos2d-x游戏开发】细数Cocos2d-x开发中那些常用的C++11知识

  自从Cocos2d-x3.0开始,Cocos2dx就正式的使用了C++11标准.C++11简洁方便的特性使程序的可拓展性和可维护性大大提高,也提高了代码的书...

11430
来自专栏xingoo, 一个梦想做发明家的程序员

【面试虐菜】—— JAVA面试题(1)

今天参加笔试,里面有设计模式,和一些基础题! 印象最深的是:什么不是Object的函数,我蒙的finalize,哎,无知! 还问了,接口与抽象类的不同,还...

21590
来自专栏专注 Java 基础分享

深入理解Java常用类----String

     Java中字符串的操作可谓是最常见的操作了,String这个类它封装了有关字符串操作的大部分方法,从构建一个字符串对象到对字符串的各种操作都封装在该类...

26890
来自专栏take time, save time

初级程序员面试不靠谱指南(三)

二、指针的好基友的& 1.&的意义。说&是指针的好基友其实不恰当,因为&这个符号在C/C++不止有一种含义,但是因为其经常会和指针一起出现在被问的问题列表上,所...

33890
来自专栏轮子工厂

6. 简单又复杂的“运算符”,建议你看一哈

昨天的《5. 很“迷”的字符与字符串》初稿本来很短的,但是我觉得内容太少了,就加了一些,结果好像就变得特别多〒▽〒。

9430
来自专栏IT可乐

Java数据结构和算法(六)——前缀、中缀、后缀表达式

  前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆...

27290

扫码关注云+社区

领取腾讯云代金券