项目四 任务一 算术、自增自减、赋值、逗号运算符

项目四 运算符与表达式

项目概述

本项目主要讲C语言中的运算符与表达式,这一项目的内容又是C语言的基础内容,所以大家也要重视起来,不要落下。本项目有两个任务,任务一会介绍算术、自增自减、赋值、逗号运算符以及相关表达式,任务二我们还会学到比较运算符以及逻辑运算符,学好这两个运算符为我们以后学习选择结构和循环结构打下了基础,在任务二中我们还会学到sizeof运算符,这个运算符是来获取数据在内存中的字节,在学习的时候我们再做深入介绍,最好我们把运算符的优先级和结合性给做个总结。

项目目标

掌握算术、自增自减、赋值、逗号运算符以及表达式

掌握比较运算符和逻辑运算符及表达式

掌握sizeof运算的使用

掌握运算符的优先级与结合性

任务一 算术、自增自减、赋值、逗号运算符

任务描述

运算符是编程语言不可缺少的一部分,用于对一个数值或是多个数值进行运算。通过本任务的学习,读者可以掌握C语言算术、自增自减、赋值、逗号运算符,以及相关的表达式的使用。

任务目标

掌握算术、自增自减、赋值、逗号运算符以及表达式。

熟悉算术、自增自减、赋值、逗号运算符的优先级以及结合性。

相关知识

4-1-1  算术运算符与算术表达式

1.算运算符

算术运算符用于执行程序中的数学运算,C 语言中常用的算术运算符有以下 7种,如下表4-1所示:

表 4-1算数运算符

运算符

运算

范例

结果

+

正号

3;

3

-

负号

b=4;-b;

-4

+

5+5

10

-

6-4

2

*

3*4

12

/

5/5

1

%

取模(即算术中的求余数)

7%5

2

 

上面的大多数运算我们都比较熟悉,下面仅对除法和去模做些说明。

(1) 对于除号“/”,它的整数除和小数除是有区别的:整数之间做除法时,只保留整数部分而舍弃小数部分。 例如:int x= 10/3 ,结果是 3 。

(2)当对一个数取模时,可以等价 a%b=a-a/b*b , 这样我们可以看到 取模的一个本质 运算。

接下来我们通过一个案例来讲+, - , * , / , %,用法,请看实例4-1所示。

实例4- 1算术运算符的使用

#include <stdio.h>

int main()

{

    int a = 8;

int b = 7;

printf("%d与%d的算术运算的结果如下",a,b);

printf("\na-b=%d", a - b);  

printf("\na+=b=%d", a + b);  

printf("\na*b=%d", a * b);

printf("\na/b=%d", a/ b);

printf("\na%%b=%d", a % b);

    getchar();

    return 0;

}

运行结果如图4-1所示。

图4- 1实例4-1案例运算结果

上述案例中,分别对变量a与变量b进行了算术运算,注意在格式化打印函数printf中输出%(取模)时,可以连续用两个%,即printf("%%");这个语句会输出一个%。

2.算术表达式

算术表达式是由常量、变量、函数、圆括号、运算符等组成。一个常量、一个变量(已赋过值)、一个函数都是合法的表达式,是表达式的简单情况。例如:a+1、a-b、1*10、20/2、30%4…..等等。

3.算术运算符的优先级

 

在C 语言中,算术运算同样存在着规则。当算术表达式由多个不同的算术运算符组成时,会按照运算符的优先级进行运算:先乘除后加减、先括号里再括号外,优先级相同,按照自左向右的顺序进行运算,如表4-2所示。

表 4-2算术运算符的优先级

运算符

描述

优先级

结合性

* / %

算术乘除运算

3

从左向右

+ -

算术加减运算

4

从左向右

例如:

a*10+100%3-b/10。

小括号优先级最高,先计算(100%3)。*与/优先级相同,自左向右运算,先计算 a*10, 再计算 b/10。+与-优先级相同,自左向右运算,先计算加法,再计算减法。

和数学中一样,可以通过小括号()来改变运算优先级,不过 C 语言中只有(),没有[]、{},()可以嵌套多层。a*(10+100%(3-b)/10);

4-1-2  自增与自减运算

1.自增自减运算符

自增运算符是“++”由2 个“+”组成,作用是将变量值增加 1,例如声明int a=2;

变量自增运算就可以这样表示:++a或a++,都表示变量自增1,运算之后的结果a=3。

自减运算符是”--”由2个“-”组成,作用是将变量值减 1,例如声明int a=2;

变量自减运算就可以这样表示:--a或a--,都表示变量自减1,运算之后的结果a=1。

关于自增自减前缀与后缀,后面我们来说差别。

 

  1. 自增自减运算表达

自增运算表达式是由自增自减运算符、小括号、操作数连接起来等组成。注意自增自减操作符最终都是要给某个变量赋值,所以自增与自减运算只能用于变量运算,不能是常量、表达式等。例如:以下都是错误写法:

--22 //错误写法,不能是常量

(a+3)++  //错误写法,不能是表达式

3.自增或是自减的前置和后置的异同点。

(1)当自增当做一个独立语言使用时,不管是 ++a; 还是 a++; 都是一样的,等价 ,

接下来我们通过一个案例来讲独立语言使用a++和++a,用法,请看实例4- 2

#include<stdio.h>

 int main()

{

int a=1;

a++;

printf("a=%d\n",a);

getchar();

return 0;

}

运行结果:2

#include<stdio.h>

int main()

{

int a=1;

++a;

printf("a=%d\n",a);

getchar();

return 0;

}

运行结果:2

这样,a++和++a 都相当于 a=a+1。如图4-2所示。

 

图4- 2 自增运算符在独立使用举例

自减在独立使用中和自增的效果一致。

(2)当 自增 当做一个 表达式使用时 如j = ++i 等价 i = i + 1; j = i; 如图4-3所示。

图4- 3 自增运算符前置在表达式中的使用

 

表达式使用时 如j = i++ 等价 j = i ;  i=i++; 如图4-4所示。

图4- 4  自增运算符后置在表达式中的使用

 

自减在当做一个 表达式使用时与自增的效果一致。

下面再通过一个例子来巩固一下自增运算表达式的使用,请看实例4- 3所示。

#include<stdio.h>

int main()

 {

int a=1;

printf("%d\n",a++); //后++

printf("a=%d\n",a);

getchar();

return 0;

 }

运行结果:

1

a=2

 

 

#include<stdio.h>

int main()

 {

int a=1;

printf("%d\n",++a); //前++

printf("a=%d\n",a);

getchar();

return 0;

}

运行结果:

2

a=2

 

          

为了更好的理解现总结自增自减运算符的使用见表4-3所示。  

表 4-3自增自减运算符使用举例总结

++

自增(前)

a=2;b=++a;

a=3;b=3;

自增自减运算符优先级为2,结合性从右向左

 

++

自增(后)

a=2;b=a++;

a=3;b=2;

--

自减(前)

a=2;b=--a;

a=1;b=1;

--

自减(后)

a=2;b=a--;

a=1;b=2;

 

4-1-3  逗号表达符与表达式

1.何为逗号运算符?

C语言提供一种特殊的运算符逗号”,”运算符,在运算符中优先级别最低。

2.何为逗号表达式?

用逗号将各表达式分割,整个式子称为逗号表达式,它将两个及其以上的式子联接起来,从左往右逐个计算表达式,整个表达式的值为最后一个表达式的值。

例如:表达式1,表达式2,..表达式n

其计算的过程是:先计算机表示1,再计算机表达式2,依次计算最后表达式n的值是整个逗号表达式的值。

例    3+5,6+8    得       14

      a=3*5,a*4           60

      x=(a=3,6*3)          18     x=18

      x=a=3,6*a           18     x=3

注意:不是任何地方出现的逗号都作为逗号运算符

      例   函数参数之间使用逗号分割

      printf("%d,%d,%d",a,b,c);            a,b,c 不是逗号表达式

      printf("%d,%d,%d",(a,b,c),b,c);      (a,b,c)是逗号表达式

4-1-4  赋值运算符与表达式

1.赋值运算符

在C 语言共提供了 两种形式个赋值运算符,如下:

(1)基本赋值运算符:=。

(2)复合赋值运算符:+=(加赋值)、-=(减赋值)、*=(乘赋值)、/=(除赋值)、%=(求余赋值)。

2.赋值表达式

由赋值运算符将一个变量和一个表达式连接起来的式子,称为赋值表达式。

如 int a=5; 表示把 5 赋值给整型变量 a,不能读成 “a等于5”。赋值号左边必须为左值,赋值号右边的右值可以为常量、变量或表达式。如下赋值均是正确的。

int a,b; //定义整型变量a和b

a=3; //把常量3赋值给a,右值为常量

b=a; //把变量a的值赋给b,右值为变量

b=a+3; //把求和表达式a+3的值赋给b,右值为表达式

复合赋值:+=、-=、*=、/=、%=

a+=b; 等价于 a=a+b;

a-=b; 等价于 a=a-b;

a*=b; 等价于 a=a*b;

a/=b; 等价于 a=a/b;

 

现将赋值运算的使用总结如下,见表4-3所示。

表 4-3 赋值运算符的使用

运算符

运算

范例

结果

=

赋值

a=3;b=2;

a=3;b=2;

+=

加等于

a=3;b=2;a+=b;

a=5;b=2;

-=

减等于

a=3;b=2;a-=b;

a=1;b=2;

*=

乘等于

a=3;b=2;a*=b;

a=6;b=2;

/=

除等于

a=3;b=2;a/=b;

a=1;b=2;

%=

模等于

a=3;b=2;a%=b;

a=1;b=2;

 

通过下面的例子,掌握上述 4 种复合赋值运算符,如4-4案例所示。

实例4- 4分析以下程序,输出其运行结果。

#include<stdio.h>

int main ()

{

    int a=1,b=2,c=3; //定义三个整型变量,并初始化

    float d=10.2f; //定义float变量d,用浮点常量10.2初始化

    a+=1; //相当于 a=a+1;即 a=1+1=2

    b-=a+5;

    c*=a-4;

    printf ("%d,%d,%d,%f",a,b,c,d/=a);

    return 0;

}

运行结果 如图4-5所示。

图4- 5 实例4-4的运行结果

代码分析:

1. float d=10.2f; 如果改为 float d=10.2; 虽然没有语法错误,可以正常运行,但一般编译器会提示 warning(警告),原因是编译器会把 10.2 等常量默认当成 double 型常量处理,与 d 的类型 float 不一致,故出现警告。因此可通过加 f 明确 10.2 为 float 型常量。

2.a+=1; 相当于 a=a+1; 求出 a 为 2。

3.b-=a+5; 由于赋值运算符的优先级低于算术求和运算符,故该语句等价于 b=b-(a+5);,即 b=2-(2+5);,得 b=-5;。同理,c*=a-4; 即 c=3*(2-4);,故 c=-60

4.printf("%d,%d,%d,%f",a,b,c,d/=a); 由于输出列表中 a、b 和 c 均为 int 型变量,故输出格式占位符均为 %d;输出列表中第 4 项为表达式,其表达式的值为 d=d/a=10.2f/2=5.1,为浮点类型,输出格式占位符为 %f,float 类型为小数点后保留 6 位数字。

猜你喜欢

转载自blog.csdn.net/qq_27248989/article/details/106079345
今日推荐