C语言运算符和表达式

​ C使用**运算符(operator)**来代表算术运算。例如,+运算符可以使它两侧的值加在一起。如果您觉得术语“运算符”听起来比较奇怪,那么请您记住那些东西总得有个名称。与其被称之为“那些东西”或“数学符号”,被称之为“运算符”似乎看起来更专业一些! 现在,除此之外,让我们再看一下其他的基本运算符。

赋值运算符

在C里,符号=不表示“相等”,而是一个赋值运算符。下面的语句是将2023赋给num的变量:

num=2023;

也就是说,符号=的左边是一个变量名,右边是赋给该变量的值。符号=被称为赋值运算符(assignment operator)。再次强调不要把这行代码读做“num等于2023”,而应该读为“将值2023赋给变量num”。赋值运算符的动作是从右到左

或许变量的名字和变量值之间的区别看起来微乎其微,但是请考虑下面的常量计算机语句:

i=i+1;

在数学上,该语句没有任何意义。如果您给一个有限的数加1,结果不会“等于”这个数本身。它意味着“找到名字为i的变量的值:然后对那个值加1,然后将这个新值赋给名字为i的变量”。

像下面的这条语句:

2023=num;

在C中是没有意义的(确切的说是无效的),原因是2023只是一个常量。您不能将一个值赋给一个常量;那个常量本身就是它的值了。所以,当您准备键入代码时请记住在符号=左边的项目必须是一个变量的名字。实际上,赋值运算符左边必须指向一个存储位置。最简单的方法是使用变量的名字,但是以后您会看到,“指针”也可以指向一个存储位置。更普遍地,C使用术语“可修改的左值”(modifiable Ivalue)来标志那些我们可以为之赋值的实体。“可修改的左值”或许不是那么直观易懂,所以我们先看看一些定义。

术语:数据对象左值右值操作数

数据对象”(data object)是泛指数据存储区的术语,数据存储区能用于保存值。例如:用于保存变量或数组的数据存储区是一个数据对象。

C的术语左值(lvalue)指用于标识一个特定的数据对象的名字或表达式。例如:变量的名字是一个左值。所以对象指的是实际的数据存储,但是左值是用于识别或定位那个存储的标识符。

因为不是所有的对象都是可更改值的,所以C使用术语“可修改的左值”来表示那些可以被更改的对象。所以,赋值运算符的左值应该是一个可修改的左值。lvalue中的l确实是英文单词left的意思,因为可修改的左值可以用在赋值运算符的左边。

术语"右值"(rvalue)指的是能赋给可修改的左值的量。例如,下面的语句:

num=2023;

这里是一个可修改的左值,2023是一个右值。您可能猜到rvalue中的r表示right。右值可以是常量、变量或者任何可以产生一个值的表达式。我们可以把变量理解为一个容器,放在左边当左值时,意思为保存、存放右边的值。所以,我们可以说=运算符的左操作数是可修改的左值。

C语言中算数运算符主要包括:加法+、减法-、乘法*、除法/、求模%、自增++、自减–。

自增++和自减–,是单目运算符,因为它们只需要一个操作数,加法+、减法-、乘法*、除法/、求模%,是双目运算符

自增++自减–又称为“增量运算符”(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+23
减法-从它前面的数减去后面的数5-32
乘法*将它前面的数乘以后面的数2*36
除法/用它左边的值除以右边的值8/32(整数的除法会丢掉小数部分)
取余%求用它左边的值除以右边的数后的余数5%32(%运算符两侧的操作数必须为整数)

例子:

#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

C语言有32个运算符,其中有些运算符比其他运算符要常用的多。我们前面已经讨论的那些是最常用的,现在我们将继续介绍几个比较有用的运算符。

关键字"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

C语言中逻辑运算符包含逻辑与&&逻辑或||逻辑非!三种。其中逻辑与&&是双目运算符,即需要运算符两边都要有表达式,且两边表达式都为真,此表达式才为真;逻辑||也是双目运算符,要求左右两边的表达式只要有一个为真整体就为真。最后一个逻辑非!运算符是单目运算符,只需右边跟一个表达式,表示取反的意思,即原先真的取反则为假,原先假的取反则为真。

下面我们举几个例子,方便大家理解和巩固,如以下几个表达式:

3 && 5

10 && 0

2>=3 || 10

5>=5 || !0

大家可以看到,逻辑运算符的左右两边可以是一个字母或一个数字,也可以是一个子表达式,都可以复合组合的使用。同样,大家也可以借助printf直接输出它们的值,代码如下:

#include<stdio.h>
int main()
{
    printf("%d\n",3 && 5);
    printf("%d\n",10&&0);
    printf("%d\n",2>=3 || 10);
    printf("%d\n",5>=5 || !0);
    return 0;
}

C语言?:条件运算符

下面给大家介绍一个三目运算符,即?:

首先介绍一个概念,所谓的“”是指这个运算符参与运算的对象个数

比如前面我们介绍了+、-、*、\等等运算符,这些需要两个数或者变量运算,所以就属于双目运算符;而++和–一个对象就可以组合,这种就是单目运算符,很好理解,那么今天所提到的三目,当然就是有三个对象参与运算了!这可是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。这下大家明白了吧!

这就是三目运算符的用法,大家可以理解一下!

C语言关系运算符

C语言中关系运算符,顾名思义是比较关系的,分别有:大于>小于<大于或等于>=小于或等于<=是否等于==是否不等于!=共六种。既然比较关系,那当然需要两个操作数,即他们也都是双目运算符,需要注意的是,关系运算符的比较结果是逻辑值,即非真即假,也就是非1即0。

比如如下关系比较的结果,大家可以边读边验证:

1>=2 不成立为假,值为0

2>=2 成立为真,值为1

3>=0 成立为真,值为1

10==10 成立为真,值为1

20!=20 不成立为假,值为0

大家可以借助printf直接打印结果,代码如下:

#include<stdio.h>
int main()
{
    printf("%d\n",3>=2);
    printf("%d\n",5>=5);
    printf("%d\n",10!=10);
    return 0;
}

C语言表达式和语句

在此之前,我们多次用到了术语表达式和语句,现在我们需要深刻的理解他们了,语句是组成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;

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RDZ-hyd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值