目录

  • 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 第三章  分支结构程序设计
    • 3.1 第一节  关系表达式和逻辑表达式
    • 3.2 第二节  if单分支语句
    • 3.3 第四节  if双分支语句
    • 3.4 第五节  if多分支语句
    • 3.5 第六节  case多分支语句
    • 3.6 第七节  分支结构程序设计实例
    • 3.7 本章小结
    • 3.8 本章单元测试
    • 3.9 书中本章习题答案
  • 4 第四章  循环结构程序设计
    • 4.1 第一节  While循环
    • 4.2 第二节  do ... while循环
    • 4.3 第三节  for循环
    • 4.4 第四节  多重循环
    • 4.5 第五节  break语句和continue语句
    • 4.6 第六节  循环结构程序设计实例
    • 4.7 本章小结
    • 4.8 书中本章习题答案
  • 5 第五章 数组
    • 5.1 第一节  一维数组的定义和使用
    • 5.2 第二节  二维数组的定义和使用
    • 5.3 第三节  字符数组的定义和使用
    • 5.4 第四节  数组的应用举例
    • 5.5 本章小节
    • 5.6 书中本章习题
  • 6 第六章  函数
    • 6.1 第一节  函数的定义
    • 6.2 第二节  函数的调用
    • 6.3 第三节 数组作为函数参数
    • 6.4 第四节  变量的作用域
    • 6.5 第五节 变量的存储类别
    • 6.6 第六节 函数应用实例
  • 7 第七章 结构体和共用体
    • 7.1 第一节  概述
    • 7.2 第二节  定义结构体变量的方法
    • 7.3 第三节 结构体变量的引用
    • 7.4 第四节 结构体数组
    • 7.5 第五节 共用体
    • 7.6 第六节  结构体和共用体应用实例
  • 8 第八章 指针
    • 8.1 第一节  指针的概念
    • 8.2 第二节  指向简单变量的指针
    • 8.3 第三节 指向数组的指针变量
    • 8.4 第四节  指向字符串的指针变量
    • 8.5 第五节 指针作为函数参数
    • 8.6 第六节  指向结构体的指针变量
    • 8.7 第七节 指针应用实例
  • 9 第九章  文件
    • 9.1 第一节  文件概述
    • 9.2 第二节  文件的打开和关闭
    • 9.3 第三节 文件的读/写函数
    • 9.4 第四节  文件定位函数
    • 9.5 第五节  文件应用实例
    • 9.6 本章小节
    • 9.7 本章习题
  • 10 附录
    • 10.1 附录A  基本字符ASCII码表(0~127)
    • 10.2 附录B  运算符优先级表
    • 10.3 附录C 常用C库函数表
    • 10.4 附录D  编译常见错误提示
    • 10.5 附录E  常见C语言英语单词
    • 10.6 附录F  如何从十进制转换为二进制
    • 10.7 附录G  如何把二进制数转化为十进制数
    • 10.8 附录H  什么是编译器
    • 10.9 附录I  与编译器相关的几个知识点
  • 11 数组
    • 11.1 一维数组
    • 11.2 二维数组
    • 11.3 字符数组
    • 11.4 常见问题集锦
    • 11.5 配套课件
    • 11.6 配套实训
  • 12 第一章 C语言程序设计基础
    • 12.1 程序设计语言的发展及其特点
      • 12.1.1 为什么要学习C语言
      • 12.1.2 什么是程序设计语言
      • 12.1.3 程序设计语言发展的三个阶段
    • 12.2 C语言的发展及其特点和应用
      • 12.2.1 C语言的发展史
      • 12.2.2 C语言的特点
      • 12.2.3 C语言的应用以及其他语言的关系
    • 12.3 C语言程序的基本结构
      • 12.3.1 最简单的C语言程序
      • 12.3.2 计算输入的两个整数的和
      • 12.3.3 练习:计算输入的两个整数的和
    • 12.4 编制C语言程序的基本步骤
      • 12.4.1 编写C程序的步骤
      • 12.4.2 VC6.0集成开发环境介绍
      • 12.4.3 建立工程操作演示
      • 12.4.4 练习:我们编的第一个程序
      • 12.4.5 程序调试
    • 12.5 习题
  • 13 基本数据类型、运算符与表达式
    • 13.1 预备知识
      • 13.1.1 计算机系统组成
      • 13.1.2 计算机中数的表示及进制转换
    • 13.2 C语言的数据类型
    • 13.3 常量、变量和标识符
      • 13.3.1 标识符
      • 13.3.2 常量
      • 13.3.3 变量
    • 13.4 简单数据类型与表示范围
      • 13.4.1 整型数据
      • 13.4.2 整数在内存中的表示
      • 13.4.3 整型变量
      • 13.4.4 整数常量的分类
      • 13.4.5 实型数据
      • 13.4.6 字符型数据和字符串常量
      • 13.4.7 简单数据类型的表示范围
      • 13.4.8 简单的数据输出
    • 13.5 运算符与表达式
      • 13.5.1 赋值运算符、赋值表达式
      • 13.5.2 强制类型转换符
      • 13.5.3 算术运算符、算术表达式
      • 13.5.4 自增自减运算符、符号运算符
      • 13.5.5 算术运算符中数据类型转换规则
      • 13.5.6 位运算符、位运算表达式
      • 13.5.7 逗号运算符、逗号表达式
      • 13.5.8 其他运算符:sizeof运算符
      • 13.5.9 关系运算符与表达式
      • 13.5.10 逻辑运算符与表达式
      • 13.5.11 条件运算符与表达式
    • 13.6 运算符的优先级和结合性
  • 14 基本输入输出和顺序程序设计
    • 14.1 程序的控制结构
    • 14.2 格式化输出printf
    • 14.3 格式化输入scanf
    • 14.4 字符数据的非格式化输入输出
    • 14.5 顺序程序设计举例
  • 15 选择结构程序设计
    • 15.1 C程序中语句的分类
    • 15.2 关系运算符、逻辑运算符、条件运算符
      • 15.2.1 关系运算符和关系表达式
      • 15.2.2 逻辑运算符和逻辑表达式
      • 15.2.3 条件运算符和条件表达式
    • 15.3 选择结构的程序设计
      • 15.3.1 if语句
      • 15.3.2 switch语句
    • 15.4 选择结构程序设计举例
      • 15.4.1 例1 计算员工当月薪水
      • 15.4.2 例2 判定闰年
      • 15.4.3 例3  简单表达式计算
  • 16 循环结构程序设计
    • 16.1 循环结构的程序设计
      • 16.1.1 while语句
      • 16.1.2 do-while语句
      • 16.1.3 for语句
      • 16.1.4 循环嵌套
      • 16.1.5 break与continue语句
      • 16.1.6 exit()函数
    • 16.2 循环结构类型的选择及转换
    • 16.3 循环结构程序设计举例
  • 17 数组
    • 17.1 一维数组
      • 17.1.1 一维数组的定义
      • 17.1.2 一维数组的引用
      • 17.1.3 一维数组的赋值
      • 17.1.4 应用实例1:字符统计
      • 17.1.5 应用实例2:冒泡排序
      • 17.1.6 应用实例3:选择排序
      • 17.1.7 应用实例4:斐波那契数列
    • 17.2 二维数组及多维数组
      • 17.2.1 二维数组的定义、引用和赋值
      • 17.2.2 二维数组的应用举例
    • 17.3 字符串与数组
      • 17.3.1 字符串的本质
      • 17.3.2 字符及字符串操作的常用函数
      • 17.3.3 字符串的应用举例
      • 17.3.4 字符串数组
      • 17.3.5 字符串数组的应用举例
    • 17.4 数组综合应用举例
  • 18 函数
    • 18.1 函数的概述
    • 18.2 函数的定义和调用
    • 18.3 函数参数的传递方式
    • 18.4 变量的作用域和生存期
    • 18.5 变量的存储类型
    • 18.6 函数的嵌套与递归调用
    • 18.7 函数的作用域
    • 18.8 函数的封装
    • 18.9 函数应用综合举例
    • 18.10 本章习题
  • 19 指针
    • 19.1 指针与指针变量的概念
    • 19.2 指针变量的定义和引用
    • 19.3 指针和地址运算
    • 19.4 指针与数组
      • 19.4.1 数组的指针和指向数组的指针变量
      • 19.4.2 指向多维数组的指针——数组指针
      • 19.4.3 元素为指针的数组——指针数组
    • 19.5 指针与字符串
    • 19.6 指针与动态内存分配
    • 19.7 多级指针
    • 19.8 指针作为函数参数
    • 19.9 指针作为函数的返回值——指针函数
    • 19.10 本章习题
  • 20 VC6  Debug
    • 20.1 VC6  Debug
第七节  运算符
  • 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  

说明:

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

      例1:如果两边均为整型,则不要转换,如:5 % 3; 

      例2:如果两边不为整型,则要进行数据类型强制转换,如:(int)5.0 % 3;

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

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

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

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

2.6.2   自增、自减运算符

       自增(++)、自减运算符(--)属于单目运算符优先级为2,结合方向右结合性”。

1、自增运算符(++)两种用法形式:

       前缀形式:

        

     后缀形式:

        

2、自减运算符(--)两种用法形式:

     前缀形式:

    

    后缀形式:

    

       注意事项:

       ①只能用于整型变量、字符型变量或指针变量。

       ②单独作为语句使用时,用法简单,相当于 “i=i+1;” 或 “i = i-1;”语句。

       ③用于表达式时比较复杂,关键在于区分先计算或先取值,关键在于区分两部份的值:变量的值或自增(自减)表达式的值。

       ④ 运算速度快

简单用法1:

       int   i = 0 ;

       ++i;

       说明:单独使用法,相当于 i=i+1;

简单用法2:

        int   a, i = 0 ;

        a = i ++ ;

       说明:用于简单表达式,“a = i++; ”相当于如下两句:① a=i; ② i=i+1; 语句执行后,a的值为0,i的值为1。

简单用法3:

       int  s, i = 3;

       s = (++i)+(++i)+(++i);

       说明:用于复杂表达式中,难以理解。(++i)+(++i)+(++i) 相当于 变量i 三次加1 ,变量 i 的值变为6,s的值最后变为18。

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

  1. #include <stdio.h>

  2. main( )

  3. {   int i, j, k;

  4.     k=30;

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

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

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

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

  9. }

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


2.6.3  赋值运算符

       赋值运算符为“=”,它为“右结合性”,优先级为14倒数第二

注意: ① 赋值运算符的左边一定为变量

简单用法1:

       int   a, b, c;

       a = b = c =1 ;

       说明:上述表达式分析如下图所示,同时给多个变量赋同一个值。上述表达式有三个赋值运算符,优先级相同,结合方向从右往左,相当于如下表达式:a = ( b = ( c = 1 ) )。

                

简单用法2:

       int   a=1, b=2, c=3;

       说明:在定义变量时,初始化变量。

请思考:

       ① 有如下语句:  int   a=b=c=0;    此语句错在什么地方?这个是很多初学者易犯的一个小毛病。

       ② 某学生在编写程序时,写出如下的语句:

               int   a=1, b=2, c=3, s;

               s = a + b = c ;

       请问:以上语句有什么语法错误?

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

  1. #include  <stdio.h>

  2. main( )

  3. {   double k, x, y;

  4.     x=(k = 9.8)+7;

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

  6.     y=k=9.8+7;

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

  8. }

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


图2-11   例2-13运行结果

源程序分析:

1)语句“ x=(k=9.8)+7; ”执行过程分析:

如下图所示,从左往右,扫描表达式,先执行优先级高的运算符,再执行优先级低的运算符,能计算而不影响计算结果的运算符则先算。    

          

"k=9.8"表达式是一个赋值表达式,做了两件事:①变量k的值变为9.8,②"k=9.8"表达式的值为9.8

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

2)语句”y=k=9.8+7;“执行过程分析:

如下图所示:“+”比“=”的优先级高,且赋值运算符的结合方向是右结合性,即自右至左。

          

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

2.6.4   逗号运算符

1、逗号运算符的有关概念

      1)逗号运算符用于将多个表达式连接起来。

     2)逗号运算符的优先级为15最低

     3)逗号运算符的结合方向:从左往右

2、逗号运算符的格式

       格式:

              表达式1, 表达式2, …, 表达式n

3、逗号运算符的执行过程

      其执行过程如下:先求解表达式1,再求解表达式2,以此类推,直至计算第n个表达式的值。整个逗号表达式的值为最后一个表达式的值。在很多情况下,使用逗号表达式只是想求出各个表达式的值。

4、逗号运算符使用案例

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

      执行过程如下图所示。

         

例2: x=i=1, j=2, k=3;  

        上述语句相当于:x=(i=1), 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  a=2, b=4, c=5, d=16, e=7, y;          

  (1)y = a & b;   

    计算分析如下:对于按位与运算,分两步计算如下:①先将十进制数转换为二进制数,②再进行按位与运算

    计算过程如下:         

               

(2)y=a | b;    

 计算分析如下:对于按位或运算,分两步计算如下:①先将十进制数转换为二进制数,②再进行按位或运算

计算过程如下:

 (3)y=a ^ c;   

计算分析如下:对于按位异或运算,分两步计算如下:①先将十进制数转换为二进制数,②再进行按位异或运算

计算过程如下:

        

    (4)y=a<<2;   

计算分析如下:对于按位左移运算,分两步计算如下:①先将十进制数转换为二进制数,②再进行按位左移运算

计算过程如下:

         

  (5)y=d>>2;     


计算分析如下:对于按位右移运算,分两步计算如下:①先将十进制数转换为二进制数,②再进行按位右移运算

计算过程如下:

             


  (6)y=~e;     

计算分析如下:对于按位取反运算,分两步计算如下:①先将十进制数转换为二进制数,②再进行按位取反运算

计算过程如下:     

            

运算结果为:y=(1111 1000)=248

   (7)y=d & e<<2  

     计算过程分析如下:

      因为“<<”优先级高于“&”,所以,y=d & e<<2  等价于 y=d & (e<<2)

 运算过程如下:

 ① e<<2表示使e左移两位,将二进制位左移两位,空出的位补0,计算如下:

             

   ②  d & (e<<2)表示做按位与运算,计算如下:

               

    将二进制数0001 000转换为十进制数16

    所以最后“y=d & e<<2 ”运算结果为16。

位运算符实战演练(参考代码):

  1. #include   <stdio.h>

  2. main()

  3. {  int   a=2,b=4,c=5,d=16,e=7,y;

  4.    y=d & e << 2;

  5.    printf("%d\n",y);

  6. }