初识C语言 —— 运算符与表达式

初识C语言 —— 运算符与表达式,第1张

    作为一个程序员,郁闷的事情是,面对一个代码块,却不敢去修改。


糟糕的是,这个代码块还是自己写的。


—— Peyton Jones

文章目录

  • 一、表达式


  • 二、赋值运算符与赋值表达式

    • 1.变量赋初值
    • 2.自动类型转换
    • 3.强制类型转换

  • 三、算术运算符与算术表达式

    • 1.算术运算符
    • 2.算术表达式
    • 3.优先级和结合性
    • 4.自增/自减运算符

  • 四、关系运算符与关系表达式

    • 1.关系运算符
    • 2.关系表达式
    • 3.优先级与结合性

  • 五、逻辑运算符与逻辑表达式

    • 1.逻辑运算符
    • 2.逻辑表达式
    • 3.优先级与结合性

  • 六、位逻辑运算符与位逻辑表达式

    • 1.位逻辑运算符
    • 2.位逻辑表达式

  • 七、逗号运算符和逗号表达式


  • 八、复合赋值运算符

  • 九、总结


一、表达式

表达式是C语言的主题,它由 *** 作符和 *** 作数组成。


根据表达式所含 *** 作符的个数,我们可以把表达式分为简单表达式和复杂表达式,简单表达式是只含有一个 *** 作符的表达式,而复杂表达式是包含连两个及以上 *** 作符的表达式.

表达式产生的作用主要有以下两种
①.放在赋值语句的右侧(本篇博客会有所提及)
②.放在函数的参数中(暂时不做相关详解,后续会有讲解)

在这里要额外提一句,表达式的结果值是有类型的。


表达式暗含的数据类型取决于组成表达式的变量和常量的类型

tip:每个表达式的返回值都具有逻辑特性。


如果返回值是非0,那么该表达式返会真值否则回假值。


通过这个特性,我们可以将某些特定的 表达式放在用于控制流程的语句中,这样就构建出条件表达式。



二、赋值运算符与赋值表达式

在程序中经常遇到的赋值符号“=”就是赋值运算符,它的作用就是将一个数据赋给一个变量,例如:

age = 20;

同样的我们也可以将一个表达式的值赋给一个变量,例如:

total =	price * 3;

下面我会进行详细的分析讲解

1.变量赋初值

我们在声明变量的时候,可以为其赋一个初值,通俗来讲就是将一个常数或者是一个表达式赋给一个变量,变量中保留下来的值就是这个常量或者赋值语句中表达式产生的值,这就是为变量赋初值,我们依次来看这两种情况
①.将常数复制给变量
一般形式如下:

类型 变量名 = 常数;

其中变量名可以以被称为变量的标识符,以下是一个简单的实例:

int name = "CSDN";
char Char = "A";
float a = 1314.51f;

②.通过赋值表达式为变量赋初值
赋值语句把一个表达式产生的结果赋给一个变量,一般形式如下:

类型 变量名 = 表达式;

其实不难看出,其一般形式和常数赋值的一般形式是非常相似的,实例如下:

int amount = 1 + 2;
float total = price * 3;
2.自动类型转换

数值类型有很多种,如整型,长整型,字符型等等,由于这些类型的变量、长度以及符号特性都不相同,所以取值范围自然也会有所差异,那么如果我们将这些不同类型的数值混合使用会发生什么情况呢?

    在C语言默认存在一些自动类型转换规则,根据这些已存转换规则,数值类型变量可以混合使用,比如把较短的字符类型变量的值赋给
较长的数值类型变量,那么较短的数值类型变量就会升级为较长的数值类型。


但是当你想将较长的数值类型变量的值赋给较短的数据类型 变量时,那么数据就会降级级别显示,当数据大小超过比较短的数值类型的可表示范围时,就会发生数据截断,此时有些编译器就会发出相应警告

3.强制类型转换

通过上面的介绍,我们直到不是所有的类型都可以随意相互转化的。


这个时候强制类型转化的机制就显得尤为重要了。


强制类型转化的一般形式如下:

(类型名)(表达式)

我们可以看一段简单的强制类型转化代码:

float a = 10.1f;
int b = (int)a;

这上面这个代码我们可以看到,在变量之前使用包含要转换类型的括号,就对变量进行了强制类型转换


三、算术运算符与算术表达式

C语言中有两个单目算术运算符和五个双目算术运算符。


在双目运算符中,乘除法和取模运算符比加减法运算符的优先级高。


单目正负运算符的优先级最高,下面会进行详细的介绍

1.算术运算符

上文提到了算术运算符包括2个单目运算符和5个双目运算符,具体的符号以及对应功能如下图所示

符号功能
+单目正
-单目负
*惩罚
/除法
%取模
+加法
-减法

注:运算符“-”作为减法运算符,此时为双目运算符,如10-5。


而“-”也可以作为负值运算符,此时为单目运算,如-10

2.算术表达式

在表达式中使用算术运算符,则该表达式称为算术表达式。


下面是一些算术表达式的例子:

number = (2 + 3) / price;
height = top - 1;
area = height * width;

在这里需要说明的是两个整数相除的结果为整数,如6/4的结果是1,舍去的是小数部分,和我们传统数学的四舍五入要做一个区分。


那弱国其中一个数是负数时会出现什么情况呢?此时机器会采用“向零取整”的方法,也就是-1,取整后向0靠拢

3.优先级和结合性

C语言中规定了各种运算符的优先级和结合性,我们首先来了解一下有关算数运算符的优先级
①.在我们进行表达式求值的时候,通常会按照运算符的优先级别从高到低依次执行。


在算术运算符中,*、/、%的优先级要高于+、-的级别,例如:

R = x + y * z;

在上述表达式中,以为的优先级高于+,所以系统会优先进行yz的 *** 作,最后再把x加上去。


②.算数运算符的结合性
当算数运算符的优先级相同时,结合方向为自左向右,例如:

n = a - b + c;

此时由于加减法的优先级是相同的,所以b会先与“-”结合,执行a-b的 *** 作,然后再执行+c的 *** 作,这种 *** 作过程我们一般就称为“自左向右的结合性”。


4.自增/自减运算符

在C语言中还有两个较为特殊的运算符,即自增运算符“++”和自减运算符"–"。


自增运算符和自减运算符的 *** 作分别是增加1和减少1。



自增和自减运算符无论放在变量前面后面都是被允许的,使用方法一般如下:

--count;			//自减前缀符号
count--;			//自减后缀符号
++count;			//自增前缀符号
count++;			//自增后缀符号

在这些例子中运算符前后的位置并不重要,因为所得到的结果都是一致的。


     但是要注意,在表达式内部的时候,两者的用法可能有所不用,如果作为前缀,那么变量在参与表达式运算之前完成自增或者自减运算;
如果作为后缀,那么变量的自增或者自减运算是标量参与了表达式运算之后完成。



四、关系运算符与关系表达式

      我们在传统数学的学习中,经常需要比较两个数字的大小。


在C语言中,关系运算符的作用就是判断两个 *** 作数的大小关系。


1.关系运算符

关系运算符包括大于、等于、小于、大于等于、小于等于以及不等于,如图:

符号功能
>大于
>=大于等于
<小于
<=小于等于
==等于
!=不等于
2.关系表达式
   关系运算符用于对两个表达式的值进行比较,返回一个真值或者假值。


而返回的到底是真值还是假值就取决于表达式中的值和所用的运算符了。


其中真值为1,假值为0。


而真值代表的就是指定的关系成立,反之,假值代表的就是指定的关系不成立。


下面是一些简单的例子:

6 > 5;  //以为6大于5,所以关系成立,即表达式的结果为真值
6 >= 5;  //以为6大于5,所以关系成立,即表达式的结果为真值
6 < 5;  //以为6大于5,所以关系不成立,即表达式的结果为假值
6 <= 5;  //以为6大于5,所以关系不成立,即表达式的结果为假值
6 == 5;  //以为6不等于5,所以关系不成立,即表达式的结果为假值
6 != 5;  //以为6不等于5,所以关系成立,即表达式的结果为真值

关系运算符通常用来构造条件表达式,在程序流程控制语句中经常看到它的身影。


我们用一个例子来进行分析:

if(number < 10)
{
	......   //判断条件为真值,执行代码
}

在这里,if(number < 10)就是判断number小于10的这个关系是否成立,成立则为真,进入if语句内执行代码,反之为假则无法进入if语句。


注:这里要给大家提个醒。


在我们进行判断的时候,一定要注意等号运算符“==”的使用,千万不要和赋值运算符“=”混淆。


3.优先级与结合性

关系运算符的结合性都是自左向右的,在我们使用关系运算符是常常会判断连个表达式之间的关系,但由于运算符之间存在优先级的问题,稍有不慎我们的处理就会出现错误。


在这里举个简单的小例子:

if(number1 = number2 != 10)
{
	...
}

以为"!=“运算符的优先级要高于”="运算符,所以number!=的判断 *** 作会在赋值 *** 作前执行,这就导致了我们的程序不会按照之前的意愿执行。


那么我们要怎么让这段程序“改邪归正”呢?我们前文提到过括号运算符具有最高的优先级,因此,我们只需要用括号来表示需要优先进行计算的表达式即可,也就是:

if((number1 = number2) != 10)
{
	...
}

这种写法显然更为清楚而且不会产生混淆,而且也更加的简洁精确。



五、逻辑运算符与逻辑表达式

    逻辑运算符根据表达式的真或者假属性返回真值或假值。


在C语言中,表达式的值非0,那么其值就为真。


非零的值用于逻辑运算时,和1是 等价的,而假值则总是为0。


1.逻辑运算符

逻辑运算符一共有三种,如下图所示:

符号功能
&&逻辑与
II逻辑或
!单目逻辑非

这里要注意,表格中的逻辑与运算符“&&”和逻辑或运算符“||”都是双目运算符。


2.逻辑表达式

由上文我们可以得知,关系运算符可用于对两个 *** 作数进行比较,而使用逻辑运算符可以将多个关系表达式的结果合并在一起进行判断,一般形式如下:

表达式 逻辑运算符 表达式

通常情况下,这些运算符用来构建条件表达式,用在控制程序的流程语句中,例如if、whlie、for语句等。


3.优先级与结合性
      逻辑与运算符“&&”和逻辑或运算符“||”都是双目运算符,结合方向自左至右;“!”是单目运算符,需要有一个 *** 作数,结合方向同样是
自左至右。


逻辑运算符的优先级从高到低依次为单目逻辑非运算符“!”、再到逻辑与运算符“&&”,最后是逻辑或运算符“||”。



六、位逻辑运算符与位逻辑表达式

    C语言中一个比较富有特色的内容就是位运算。


位逻辑运算符可以实现位的设置、清零、取反和取补 *** 作,不是所有的汇编语言都可以实现位运算的。


1.位逻辑运算符

位逻辑运算符包括位逻辑与、位逻辑或、位逻辑非以及取补,如下表所示:

符号功能
&位逻辑与
I位逻辑或
^位逻辑非
~取补

表格中除了取补运算符意外,其余的都是双目运算符。


值得注意的是,这些运算符都只能用于整型表达式。


2.位逻辑表达式

在程序运行中,为逻辑运算符一般被程序员用作开关标志。



下面我们可以看看为逻辑与运算符的典型应用:

if(basketball & football)
{
	...
}

这一小段代码的含义就是:if语句对后面括号的表达式进行检测。


如果表达式返回的是真值,则执行下面的语句块,反之则不执行。


其中运算符用来对两个变量的位进行检测,判断是否有吻合之处。



七、逗号运算符和逗号表达式

    在C语言中,可以用逗号将多个表达式分隔开来。


其中,被分隔的表达式被分别计算,最后整个表达式得到的值就是最后一个表达式的值。


逗号表达式也被称为顺序求值运算符,一般形式如下:

表达式1,表达式2,表达式···,表达式n

求解的过程是自左向右求解直到求解到表达式n,最后整个逗号表达式的值就是表达式n的值。



这里我想举一个例子:

price = 2 + 3, 3 + 5, 5 + 7;

在上面的代码中,我们最后得到price的值是12吗?不是!是7!按照我们上文所说的,难道得到的值不应该是最后一个表达式的值吗?这里就涉及到了我们上面还讲道德优先级的问题了,赋值运算符=“的优先级要高于逗号表达式,所以我们会优先进行赋值。


如果想得到最后一个表达式的值,应该这样修改:

price = (2 + 3, 3 + 5, 5 + 7);

只要用上优先级最高的括号,就可以使得逗号表达式优先执行了。



八、复合赋值运算符

    复合赋值运算符算是C语言独有的一个内容了,这种运算符可以使得变量 *** 作的	描述方式更为间接。


我们这里可以举一个简单的例子:

value = value + 3;

这个语句是对一个变量进行赋值 *** 作,值就是这个变量自身与一个常量3相加的结果。


而我们使用复合赋值运算符同样可以实现这一 *** 作,例如:

value += value;

这种代码描述显然简洁,这里就突出了复合赋值运算符的两个优点:
①.简化程序,使得程序更为精炼。



②.在复杂的程序下,会大大提高我们的编译效率。


九、总结
本文介绍了程序中各种运算符以及表达式,我们先介绍了表达式的概念,然后分别介绍了赋值运算符、算术运算符、关系运算符、逻辑运算符
等一系列知识点,希望大家能在本文中有所收获,一键三连哦!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/564864.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-06
下一篇 2022-04-06

发表评论

登录后才能评论

评论列表(0条)

保存