目录

  • 1 第一章  C语言概述
    • 1.1 第一节  C语言的产生和发展
    • 1.2 第二节  C语言的特点
    • 1.3 第三节  两个简单的C程序
    • 1.4 第四节  C程序的上机步骤
    • 1.5 第五节  Dev-C++介绍
    • 1.6 第六节  VC2010学习版介绍
    • 1.7 第七节  宏定义和文件包含
    • 1.8 本章小结
    • 1.9 本章单元测试
  • 2 第二章  基本数据类型与简单程序设计
    • 2.1 第一节  C语言的基本数据类型
    • 2.2 第二节  常量
    • 2.3 第三节  变量
    • 2.4 第四节  赋值语句
    • 2.5 第五节  数据输出
    • 2.6 第六节 数据输入
    • 2.7 第七节  运算符
    • 2.8 第八节  常用的数学函数
    • 2.9 第九节  顺序结构程序设计
    • 2.10 本章小结
    • 2.11 本章单元测试
  • 3 第三章  分支结构程序设计
  • 4 第四章  循环结构程序设计
  • 5 附录
    • 5.1 附录A   编译常见错误提示
    • 5.2 附录B  常见C语言英语单词
    • 5.3 什么是编译器
    • 5.4 与编译器相关的几个知识点
第七节  运算符
  • 1 文字讲解
  • 2 视频讲解

C语言程序由若干条语句组成,每条语句由变量、运算符、表达式、函数调用和控制语句等构成。C语言的运算符十分丰富,所包含的内容也很广泛表达式是由运算对象(包括常量、函数、变量)和运算符按一定规则连接起来的有意义的式子,表达式中可以包括运算符、常量变量、函数调用等,下面就介绍语句中最基本的元素:运算符和表达式

运算符包括算术运算符、自增/自减运算符、赋值运算符及逗号运算符

2.6.1  算术运算符

算术运算符如表2-6所示。

表2-6算术运算符

运算符运算优先级例子
(  )圆括号15/(1-3)
*乘法37*3=21
/除法37/3.0=2.333,73=2
% 模除37%3-1
+加法47+3=10
-减法47-3=4

说明:

 ①模除运算是两个整数相除后取余数,要求“%”的两边必须是整型数据

②若算术运算符两边均为整数,则结果仍为整数。如7/3=2,1/2=0.

 ③若参加运算的两个数中有一个数为实数,则结果为 double型

 ④每个运算符都有一个优先级,如乘法与除法的优先级高于加法与减法

在对表达式求值时,按运算符优先级的高低次序进行,如先乘除、后加减括号可改变运算次序。若一个运算符对象两侧的运算符的优先级相同,则按规定的“结合方向”处理,算术运算符的结合方向都是“从左到右”,即“左结合性”。以后可以看到,有些运算符的结合方向为“从右到左”,即“右结合性”

2.6.2   自增、自减运算符

自增、自减运算符为“右结合性”,优先级为2。例如

执行语句“k=k+1;”后,变量k的值增1,即为11。也可用语句“k++;”代替,即“k++;"代替,即"k++;" 与“k=k+1;”等价。

同样,“k--”与“k=k-1;”等价

"++"为自增运算符,“--”为自减运算符。

自增、自减运算表达式的结合方向都是自右至左,但“++k”与“k++”如果作为表达式的一部分出现,它们的运算次序不同。前者先执行“k=k+1”,然后再使用k的值;而后者则先k的值,然后再执行“k=k+1”。

例2-12  编写自增运算符程序。

#include <stdio.h>

main()

{   int i, j, k;

    k=30;

   i=k++;  //先将k的值30赋给i,再将k值增1,此时k=31,i=30

    printf("i=%d,k=%d\n", i);

    j=++k;   //k值先增1,再将k值赋予j,此时k=32,j=32

    printf("\n j=%d, k =%d\n", j,k);

运行结果如图2-10所示。

2.6.3  赋值运算符

赋值运算符为“=”,它为“右结合性”,优先级为14。

例2-13  编写赋值运算符程序。

#include  <stdio.h>

main( )

{   double k, x, y;

    x=(k = 9.8)+7;

    printf("k=%5.1f,\t x=%5.1f  \n", k, x) ;   //'\t'是跳格键,主要是为了隔开

    y=k=9.8+7;

    printf("k = %5.1f, y=%5.1f\n", k, y);

}

运行结果如图2-11所示。

分析:

 执行语句“x=(k=9.8)+7;”时先将9.8赋给k,“(k =9.8)”的值为9.8,然后9.8加上7等于16.8,再赋给x。

执行语句“y=k=9.8+7;“时,由于“+”比“=”的优先级高,且赋值运算符的结合方向是右结合性,即自右至左,因此先计算“9.8+7,值为16.8,将16.8赋给k,再将k的值16赋给变量y。此时,变量k和y的值均为16.8。

例如:

     a=b=c=0:

等价于下列3条语句

      c=0

      b=c:

     a =b:

2.6.4   逗号运算符

逗号运算符用于将两个表达式连接起来。其优先级为15,最低。

格式:

       表达式1,表达式2

功能:先求解表达式1,再求解表达式2。整个逗号表达式的值为表达式2的值。在很多情况下,使用逗号表达式只是想求出各个表达式的值。

例如:

       x=(i=1,j=2,k=3);

相当于执行以下语句。

     i=1;

    j=2;

   k=3;

   x=3

 又如:x=i=1,j=2,k=3;

 相当于执行以下语句。

    i=1;

   x=i;      //赋值运算符“=”比逗号“,”的优先级高

    j=2

   k=3;

 除了上述几个运算符和表达式外,还有逻辑运算符、关系运算符以及相应的逻辑表达式和关系表达式,这些内容将在第3章中介绍。

2.6.5  位运算

所谓位运算是指对操作数以二进制位(bit)为单位进行的数据处理。每一个二进制位只能存放一位二进制数“0”或“1”,因此位运算的运算对象是一个二进制数位的集合C提供的位运算符参见表2-7

 表2-7位运算符

优先级格式运算符含义
~取反2~a
<<左移n位5a<<n
>>右移n位5a>>n
&按位与8a& b
a^b按位异或9a^b
|按位或10alb

以上的运算中,取反运算是单目运算,其余为双目运算。运算的操作数只能是整数或型数据,不能为实型数据。手工进行位运算时,可先将整型或字符型数据转换成二进制数行结果以十进制数表示。

各种逻辑位运算符的求值规律参见表2-8

 表2-8逻辑位运算符的求值规律

ab~aa & ba ^ ba l b
110101
10
011
011011
00
000

从表2-8可以得出以下结论:

 ① ~   运算,0变1,1变0。

 ② &   运算,当两个对应位均为1时,结果为1,否则为0。

 ③^    运算,当两个对应位相同时,结果为1,否则为0。

 ④|     运算,当两个对应位均为0时,结果为0,否则为1。

 例如:  unsigned char=2, b=4, c=5, d=16, e=7, y;

          y=& b;    //y=(0000 0010) & (0000 0100)=0

          y=a | b;    //y=(0000 0010) | (0000 0100)=(0000 0110)=6

          y=a ^ c;    //y=(0000 0010) ^ (0000 0101) = (0000 0111)=7

          y=a<<2;   //y=(0000 0010)<<2 = (00001000)=8

          y=d>>2;     // y=(0001 0000) >> 2=(0000 0100)=4

          y=~e;          //y=~(0000 0111)=(1111 1000)=248

          y=d & e<<2      /*  y =d & e<<2

                                   =d & (e<<2)   因为“<<”优先级高于“&”

                                   =(00010000) & (00011100)

                                   =(0010000)=16   */