第2章 数据类型、运算符和表达式
教学目标 掌握 C 语言标识符的组成 理解 C 语言的基本数据类型 掌握变量定义的方法 掌握常用的运算符的使用 掌握混合运算的数据转换方法
2.1 C 语言的数据类型 基本类型 整  型:短整型( short )、整型( int )、长整型 long 浮点型:单精度型( float )、双精度型( double ) 字符类型 (char) 构造类型:数组、结构体、共用体、枚举 指针类型
2.2  常量与变量  2.2.1 标识符命名 2.2.2 常量 2.2.3 变量
2.2.1 标识符命名 标识符:字符序列的总称。在 C 语言里用标示符来表示常量、变量、函数和数据类型的名字  字母、数字和下划线组成; 第一个字符不能是数字字符; 不能是标准字符(关键字);
举例 sum  Sum  M.D.John da date 3days  student_name  #33  lotus_1_2_3  char  a>b  _above  $123  √  √  X √  √ X  √  X  √  X  X  √  X
2.2.2 常量 常量:在程序运行过程中其值不发生改变的量 直接常量 符号常量 :用一个标识符来表示常量  #define  符号常量 常量值 #define  PRICE  30 #include <stdio.h> int main() { int num,total; num=10; total=num*PRICE; printf(&quot;total=%d&quot;,total); return 0; } 运行结果: total=300
使用符号常量的优点  可以使程序更清晰易读  程序修改更加容易  通常用大写字母表示符号常量,小写字母表示变量,以便区别
2.2.3 变量 变量:在程序运行过程中其值可以发生改变的量 变量名 变量类型 变量的值 定义形式 类型名 变量名 1 ,变量名 2 ,……,变量名 n ;  int a,b,c; char ch; double d,f;
2.3 整型数据  整型常量 :整数(十进制常量、八进制常量和十六进制常量)  ( 1 )常量前面的“ +” 和“ -” 表示数的正、负。 ( 2 )常量也有类型,正型常量默认是 int 型(即有符号整数) ( 3 )在数的后面加上字母 u 或 U 表示无符号整数,加上字母 l 或 L 表示长整型数 0x10 0x12f 0x 或 0X 开头 数字 0~9 字母 a~f (或 A~F ) 十六进制 012  0 数字开头 数字 0~7 八进制 12  -1234 +10 非 0 数字开头 数字 0~9 十进制 举例 组成规则 组成 类型
2.3.2 整型变量  整型数据在内存中的存储形式: 整型数据在内存中是以二进制补码的形式存放  对于 4 个字节的整数 -12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 1 1 1 符 号 位
整型变量的分类  注:判断某一数据类型占内存的字节数可用 sizeof( 数据类型说明 ) 来计算 -2147483648~2147483647 32 signed (有) 0~4294967295 32 unsigned (无) 长整型 long -32768~32767 -2147483648~2147483647 16 或 32 signed (有) 0~65535 0~4294967295 16 或 32 unsigned (无) 整型 int -32768~32767 16 signed (有) 0~65535 16 unsigned (无) 短整型 short 取值范围 位数 有无符号 分类
整型变量的定义方法  [ 符号说明 ]  < 精度说明 >  变量名表;   unsigned short  a , b ; signed short  a , b ; unsigned int  a , b ; int  a , b ; unsigned long  a , b ;
2.4 浮点型数据  浮点型常量 :实型常量或实数,它只有十进制形式,全部都是有符号数 小数形式: 0~9 ,小数点和正负号表示 指数形式: 0~9 、小数点、 + - 号和字母 e/E  说明: ( 1 )浮点型常量的默认类型是 double ( 2 )在常量后面加 f 或 F 指定为 float 型  ( 3 )指数必须为整数 ( 4 ) e/E 之前必须有数字
2.4.2 浮点型变量 存储形式
浮点型变量的分类 单精度( float ) 双精度( double ) 长双精度( long double ) 浮点型变量定义方法  类型说明符 变量名列表; float a , b , c ; double a , b , c ; long double a , b , c ; 1 )浮点型数据的有效数字位有限制 2 )有效位以外的数字将被舍去
2.5 字符型数据  字符常量 : 用 单引号 括起来的单个 普通字符 或 转义字符 单引号中的字符不能是单引号(’)和反斜杠( \ ) 字符是按其所对应的 ASCII 码值来存储的,一个字符占一个字节(即 8 位)
字符串常量 :一对 双引号 (“”)括起来的 一串字符   字符串常量在内存中存储: 保存每个字符的 ASCII 值 系统自动在字符串的末尾加一个串结束标志 字符串: &quot;China&quot;   “ A” 和‘ A’ 的区别? \0 a n i h C
转义字符 :用 反斜杠 \ 后面跟一个字符或一个八进制或十六进制数表示  两位十六进制 十六进制表示的 ASCII 码的字符 \xhh 三位八进制 八进制表示的 ASCII 码的字符 \ddd 34 字符 &quot; \&quot; 39 字符’ \’ 92 字符 \ \\ 0 ASCII 为 0 的字符 \0 11 垂直制表 \v 9 水平制表 \t 13 回车(返回到当前行首) \r 10 换行 \n 12 换页 \f 8 退格 \b 7 响铃 \a ASCII 值 功能与意义 转义字符
例 转义字符举例   #include<stdio.h> int main() { printf(&quot;\101 \x42 C\n&quot;); printf(&quot;I say:\&quot;How are you?\&quot;\n&quot;); printf(&quot;\\C Program\\\n&quot;); printf(&quot;Turbo \'C\'&quot;); return 0; } 运行结果: A B C I say :”How are you?” \C Program\ Turbo  ‘C’ 例   int main() { printf(“Y\b=\n”); return 0; } 运行结果: 屏幕显示: = 打印机输出: ¥
字符变量 字符变量用来存放字符,它只能存放 一个字符 ,不能存放字符串  字符变量的定义形式  char  变量名表;  char c1 , c2 ;   char c1 , c2 ;  #include<stdio.h> int main() { char c1='a',c2='b';  c1=c1-('a'-'A'); c2=c2-('a'-'A'); printf(&quot;%c %c\n&quot;,c1,c2); return 0; }  程序运行结果: A  B
2.6 运算符和表达式 2.6.1 算术运算符 2.6.2 自增和自减运算符 2.6.3 关系和逻辑运算符 2.6.4 位运算符 2.6.5  条件运算符 2.6.6  逗号运算符 2.6.8  复合赋值运算符
2.6.1 算术运算符 算术运算符: +  、 - 、 * 、 / 、 % 说明: 两个整数相除,所得商仍然为整数,舍去小数部分,即 3/2 结果是 1  ,而不是 1.5 取余运算要求 运算符两端都必须为整型数据 ,浮点数据不能进行取余运算 除数或被除数中有一个是负数,取余运算的结果可根据公式 m=pq+r  得到余数 优先级: * 、 / 、 % 的优先级高于 + 和 - 结合性:从左向右
5+3 9-2 5*4 3/4 4%3 -5%2 8 7 20 0 1 -1
2.6.2 自增和自减运算符  + + :变量自加 1 - - :变量自减 1 前置运算: + +  在变量的前面:变量先进行加 1 运算,然后再参与其它运算 - - 在变量的前面:变量先进行减 1 运算,然后再参与其它运算 int x=5 , y=6 ; ++x  --y  ++x 为 6 , x 值为 6  --y  为 5  , y 值为 5
后置运算: + +  在变量的后面,则先参与其它运算,然后变量再进行加 1 运算 - - 在变量的后面:则先参与其它运算,然后变量再进行减 1 int x=5 , y=6 ; ++x  --y  x++ 为 6 , x 值为 6  y--  为 6  , y 值为 5
说明 ++ , -- 运算只能用于变量,不能用于常量和表达式 ++ , -- 运算的优先级为 2 级,高于 * 、 / 、 % 运算 ++ , -- 运算的结合性是从右向左  前置运算和后置运算可能带来副作用  x+++y  在函数中作为参数: printf(“%d,%d\n”,i,i++)  ( ++i ) + ( ++i ) + ( ++i ) :在 TC2.0 和 VC++6.0 的结果是不一样
例 2.6 : 前置和后置运算 #include<stdio.h> int main() { int i,j,m,n; i=8; j=10; m=++i; n=j++; printf(&quot;%d , %d , %d , %d\n&quot;,i,j,m,n); return 0; } 程序运行结果: 9  , 11 , 9 , 10
2.6.3 关系和逻辑运算符 从右向左 2 !(x>5) 非 ! 从左向右 12 x<-2||x>5 或 || 从左向右 11 x>3&&x<=8 与 && 逻辑运算符 从左向右 7 5!=4 ,x!=y 不等于 != 从左向右 7 4==4 ,x==y 等于 = = 从左向右 6 5<=4 ,x<=y 小于等于 <= 从左向右 6 5>=4 ,x>=y 大于等于 >= 从左向右 6 4>5 ,x<y 小于 < 从左向右 6 5>4 ,x>y 大于 > 关系运算符 结合性 优先级 举例 含义 符号 运算符
逻辑运算真值表 ( 1 )关系和逻辑运算符的关键是 True (真)和 False (假) ( 2 ) C 语言中,非 0 为真, 0 为假   0 0 1 1 0 0 1 0 0 1 1 0 1 0 1 0 0 1 1 1 0 0 1 1 p||q p&&q ! q ! p q p
2.6.4 位运算符 按位运算时,必须将运算对象转化为二进制 位运算必须是整型和字符型数据  从左向右 5 10<<2 按位左移 << 从左向右 5 10>>2 按位右移 >> 从右向左 2 ~5 按位反 ~ 从左向右 9 5^4 按位异或 ^ 从左向右 10 5|4 按位或 | 从左向右 8 5&4 按位与 & 结合性 优先级 举例 含义 符号
2.6.5  条件运算符 格式: 运算对象 1 ?运算对象 2 :运算对象 3  功能: 先判断 运算对象 1 的值是否为非 0 ,如果是非 0 ,其值为运算对象 2 的值,否则为运算对象 3 的值  a>b?a:b
说明: 运算对象 1 、运算对象 2 、运算对象 3 可以是任意类型,一般运算对象 1 为关系或逻辑运算对象的式子,其类型可以相同,也可以不相同。 条件运算符的优先级为 13 级 条件运算符的结合性是从右向左结合的
2.6.6  逗号运算符 定义: 用逗号把几个运算对象连接起来  格式: 运算对象 1  ,运算对象 2  ,…… ,运算对象 n 功能: 先计算运算对象 1 的值,再计算运算对象 2 的值,直到最后计算运算对象 n 的值  x=5*6 , x+10   a=3,b=4,a++,b++,a+b   40   9   说明: ( 1 )逗号运算符的优先级是 15 。 ( 2 )逗号运算符的结合性是从左向右
2.6.7  赋值运算符 赋值运算符: = 格式: 变量 = 运算对象 功能:把右边运算对象的值赋给左边变量  赋值运算符“ =” 和判断相等( == )的区别  赋值运算符的优先级为 14 级  赋值运算符的结合性是从右向左  赋值中的类型转换以左边变量的类型为主
2.6.8  复合赋值运算符 定义:复合赋值运算符是在赋值的同时,进行了运算  格式: 变量  OP= 运算对象 相当于:变量 = 变量 OP (运算对象) 优先级: 14 结合性:从右向左
从右向左 14 x<<=5 相当于 x=x<<5 按位左移赋值 <<= 从右向左 14 x>>=5 相当于 x=x>>5 按位右移赋值 >>= 从右向左 14 x|=5 相当于 x=x|5 按位或赋值 |= 从右向左 14 x^=5 相当于 x=x^5 按位异或赋值 ^= 从右向左 14 x&=5 相当于 x=x&5 按位与赋值 &= 从右向左 14 x%=5 相当于 x=x%5 取余赋值 %= 从右向左 14 x/=5 相当于 x=x/5 除赋值 /= 从右向左 14 x*=5 相当于 x=x*5 乘赋值 *= 从右向左 14 x-=5 相当于 x=x-5 减赋值 -= 从右向左 14 x+=5 相当于 x=x+5 加赋值 += 结合性 优先级 举例 含义 运算符
2.7  表达式求值 2.7.1  算术表达式 2.7.2  赋值表达式 2.7.3  关系表达式和逻辑表达式
2.7.1  算术表达式 定义: 用算术运算符号将运算对象(常量、变量、函数等)、圆括号连接起来的式子  25 X
表达式的求值 a=10 b=3
数学公式 的 C 语言表示
表达式值的类型 同一表达式中的不同类型常量及变量,均应转换为同一类型的量  C 语言的编译程序将所有操作数转换为与最高类型操作数同类型  自动类型转换
强制类型转换 (类型名)(表达式) 原来变量的数据类型不发生变化 (int)(x+y) (int)x+y (double)(3/2) (int)3.6  精度损失问题 较高类型向较低类型转换时可能发生
例 2.8 : 已知 int a=7 ; float x=2.5 , y=4.7 ;计算表达式的值
2.7.2  赋值表达式 定义: 赋值运算符将一个变量和表达式连接起来构成的式子  一般形式: < 变量 > = < 表达式 >  将表达式的值求出来,赋给左边的变量,使变量的值为表达式的值   a=3; d=func(); c=d+2; x=20/4;
表达式的值的类型以变量的类型为主   int x ; x=10+30/7+1.5 double y ; y=10+30/7+100 赋值表达式的值又可以作为另外一个赋值表达式 赋值表达式也可以包含复合赋值运算符
2.7.3  关系表达式和逻辑表达式 关系表达式  :用关系运算符将两个运算对象(算术表达式、赋值表达式、关系表达式和逻辑表达式等)连接起来构成的式子  a+3>b+4 (a>b)>(c=2) (ch!=getchar()) 注:关系表达式的值是一个逻辑值,即“真”或“假” 例 2.9 : 求下面关系表达式的值 int a=0 ;  double b=0.5 , x=0.3 ;求 a<=x<=b 5>2>7>8 int  i=1, j=7,a ;  a=i+(j%4!=0) ;求 a 0 0 2
逻辑表达式 : 用逻辑运算符将运算对象连接起来的式子  逻辑表达式的值只能是“真”或“假” 表示逻辑运算结果:以数值 1 代表“真”,以数值 0 代表“假” 判断是否为“真”:以非 0 表示“真”,以 0 表示“假”  ! 5 的值是 0 a=2&&b=4  的值是 1 a=0||b=2  的值是 1
!a  a&&b  a||b  !a||b  4&&0||2  5>3&&2||8<9-!0  ‘ c’&&‘d’   例 2.10 : 已知 a=4 , b=5 ,求下面逻辑表达式的值
短路表达式: 在逻辑表达式中不是所有的逻辑运算符都要被执行,只有在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符  例  a&&b&&c  // 只在 a 为真时,才判别 b 的值; 只在 a 、 b 都为真时,才判别  c 的值 例  a||b||c  // 只在 a 为假时,才判别 b 的值; 只在 a 、 b 都为假时,才判别  c 的值 例  a=1;b=2;c=3;d=4;m=1;n=1; (m=a>b)&&(n=c>d) // m=0 , n=1

第2章数据类型、运算符和表达式

  • 1.
  • 2.
    教学目标 掌握 C语言标识符的组成 理解 C 语言的基本数据类型 掌握变量定义的方法 掌握常用的运算符的使用 掌握混合运算的数据转换方法
  • 3.
    2.1 C 语言的数据类型基本类型 整 型:短整型( short )、整型( int )、长整型 long 浮点型:单精度型( float )、双精度型( double ) 字符类型 (char) 构造类型:数组、结构体、共用体、枚举 指针类型
  • 4.
    2.2 常量与变量 2.2.1 标识符命名 2.2.2 常量 2.2.3 变量
  • 5.
    2.2.1 标识符命名 标识符:字符序列的总称。在C 语言里用标示符来表示常量、变量、函数和数据类型的名字 字母、数字和下划线组成; 第一个字符不能是数字字符; 不能是标准字符(关键字);
  • 6.
    举例 sum Sum M.D.John da date 3days student_name #33 lotus_1_2_3 char a>b _above $123 √ √ X √ √ X √ X √ X X √ X
  • 7.
    2.2.2 常量 常量:在程序运行过程中其值不发生改变的量直接常量 符号常量 :用一个标识符来表示常量 #define 符号常量 常量值 #define PRICE 30 #include <stdio.h> int main() { int num,total; num=10; total=num*PRICE; printf(&quot;total=%d&quot;,total); return 0; } 运行结果: total=300
  • 8.
    使用符号常量的优点 可以使程序更清晰易读 程序修改更加容易 通常用大写字母表示符号常量,小写字母表示变量,以便区别
  • 9.
    2.2.3 变量 变量:在程序运行过程中其值可以发生改变的量变量名 变量类型 变量的值 定义形式 类型名 变量名 1 ,变量名 2 ,……,变量名 n ; int a,b,c; char ch; double d,f;
  • 10.
    2.3 整型数据 整型常量 :整数(十进制常量、八进制常量和十六进制常量) ( 1 )常量前面的“ +” 和“ -” 表示数的正、负。 ( 2 )常量也有类型,正型常量默认是 int 型(即有符号整数) ( 3 )在数的后面加上字母 u 或 U 表示无符号整数,加上字母 l 或 L 表示长整型数 0x10 0x12f 0x 或 0X 开头 数字 0~9 字母 a~f (或 A~F ) 十六进制 012 0 数字开头 数字 0~7 八进制 12 -1234 +10 非 0 数字开头 数字 0~9 十进制 举例 组成规则 组成 类型
  • 11.
    2.3.2 整型变量 整型数据在内存中的存储形式: 整型数据在内存中是以二进制补码的形式存放 对于 4 个字节的整数 -12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 1 1 1 符 号 位
  • 12.
    整型变量的分类 注:判断某一数据类型占内存的字节数可用sizeof( 数据类型说明 ) 来计算 -2147483648~2147483647 32 signed (有) 0~4294967295 32 unsigned (无) 长整型 long -32768~32767 -2147483648~2147483647 16 或 32 signed (有) 0~65535 0~4294967295 16 或 32 unsigned (无) 整型 int -32768~32767 16 signed (有) 0~65535 16 unsigned (无) 短整型 short 取值范围 位数 有无符号 分类
  • 13.
    整型变量的定义方法 [符号说明 ] < 精度说明 > 变量名表; unsigned short a , b ; signed short a , b ; unsigned int a , b ; int a , b ; unsigned long a , b ;
  • 14.
    2.4 浮点型数据 浮点型常量 :实型常量或实数,它只有十进制形式,全部都是有符号数 小数形式: 0~9 ,小数点和正负号表示 指数形式: 0~9 、小数点、 + - 号和字母 e/E 说明: ( 1 )浮点型常量的默认类型是 double ( 2 )在常量后面加 f 或 F 指定为 float 型 ( 3 )指数必须为整数 ( 4 ) e/E 之前必须有数字
  • 15.
  • 16.
    浮点型变量的分类 单精度( float) 双精度( double ) 长双精度( long double ) 浮点型变量定义方法 类型说明符 变量名列表; float a , b , c ; double a , b , c ; long double a , b , c ; 1 )浮点型数据的有效数字位有限制 2 )有效位以外的数字将被舍去
  • 17.
    2.5 字符型数据 字符常量 : 用 单引号 括起来的单个 普通字符 或 转义字符 单引号中的字符不能是单引号(’)和反斜杠( \ ) 字符是按其所对应的 ASCII 码值来存储的,一个字符占一个字节(即 8 位)
  • 18.
    字符串常量 :一对 双引号(“”)括起来的 一串字符 字符串常量在内存中存储: 保存每个字符的 ASCII 值 系统自动在字符串的末尾加一个串结束标志 字符串: &quot;China&quot; “ A” 和‘ A’ 的区别? \0 a n i h C
  • 19.
    转义字符 :用 反斜杠\ 后面跟一个字符或一个八进制或十六进制数表示 两位十六进制 十六进制表示的 ASCII 码的字符 \xhh 三位八进制 八进制表示的 ASCII 码的字符 \ddd 34 字符 &quot; \&quot; 39 字符’ \’ 92 字符 \ \\ 0 ASCII 为 0 的字符 \0 11 垂直制表 \v 9 水平制表 \t 13 回车(返回到当前行首) \r 10 换行 \n 12 换页 \f 8 退格 \b 7 响铃 \a ASCII 值 功能与意义 转义字符
  • 20.
    例 转义字符举例 #include<stdio.h> int main() { printf(&quot;\101 \x42 C\n&quot;); printf(&quot;I say:\&quot;How are you?\&quot;\n&quot;); printf(&quot;\\C Program\\\n&quot;); printf(&quot;Turbo \'C\'&quot;); return 0; } 运行结果: A B C I say :”How are you?” \C Program\ Turbo ‘C’ 例 int main() { printf(“Y\b=\n”); return 0; } 运行结果: 屏幕显示: = 打印机输出: ¥
  • 21.
    字符变量 字符变量用来存放字符,它只能存放 一个字符,不能存放字符串 字符变量的定义形式 char 变量名表; char c1 , c2 ; char c1 , c2 ; #include<stdio.h> int main() { char c1='a',c2='b'; c1=c1-('a'-'A'); c2=c2-('a'-'A'); printf(&quot;%c %c\n&quot;,c1,c2); return 0; } 程序运行结果: A B
  • 22.
    2.6 运算符和表达式 2.6.1算术运算符 2.6.2 自增和自减运算符 2.6.3 关系和逻辑运算符 2.6.4 位运算符 2.6.5 条件运算符 2.6.6 逗号运算符 2.6.8 复合赋值运算符
  • 23.
    2.6.1 算术运算符 算术运算符:+ 、 - 、 * 、 / 、 % 说明: 两个整数相除,所得商仍然为整数,舍去小数部分,即 3/2 结果是 1 ,而不是 1.5 取余运算要求 运算符两端都必须为整型数据 ,浮点数据不能进行取余运算 除数或被除数中有一个是负数,取余运算的结果可根据公式 m=pq+r 得到余数 优先级: * 、 / 、 % 的优先级高于 + 和 - 结合性:从左向右
  • 24.
    5+3 9-2 5*43/4 4%3 -5%2 8 7 20 0 1 -1
  • 25.
    2.6.2 自增和自减运算符 + + :变量自加 1 - - :变量自减 1 前置运算: + + 在变量的前面:变量先进行加 1 运算,然后再参与其它运算 - - 在变量的前面:变量先进行减 1 运算,然后再参与其它运算 int x=5 , y=6 ; ++x --y ++x 为 6 , x 值为 6 --y 为 5 , y 值为 5
  • 26.
    后置运算: + + 在变量的后面,则先参与其它运算,然后变量再进行加 1 运算 - - 在变量的后面:则先参与其它运算,然后变量再进行减 1 int x=5 , y=6 ; ++x --y x++ 为 6 , x 值为 6 y-- 为 6 , y 值为 5
  • 27.
    说明 ++ ,-- 运算只能用于变量,不能用于常量和表达式 ++ , -- 运算的优先级为 2 级,高于 * 、 / 、 % 运算 ++ , -- 运算的结合性是从右向左 前置运算和后置运算可能带来副作用 x+++y 在函数中作为参数: printf(“%d,%d\n”,i,i++) ( ++i ) + ( ++i ) + ( ++i ) :在 TC2.0 和 VC++6.0 的结果是不一样
  • 28.
    例 2.6 :前置和后置运算 #include<stdio.h> int main() { int i,j,m,n; i=8; j=10; m=++i; n=j++; printf(&quot;%d , %d , %d , %d\n&quot;,i,j,m,n); return 0; } 程序运行结果: 9 , 11 , 9 , 10
  • 29.
    2.6.3 关系和逻辑运算符 从右向左2 !(x>5) 非 ! 从左向右 12 x<-2||x>5 或 || 从左向右 11 x>3&&x<=8 与 && 逻辑运算符 从左向右 7 5!=4 ,x!=y 不等于 != 从左向右 7 4==4 ,x==y 等于 = = 从左向右 6 5<=4 ,x<=y 小于等于 <= 从左向右 6 5>=4 ,x>=y 大于等于 >= 从左向右 6 4>5 ,x<y 小于 < 从左向右 6 5>4 ,x>y 大于 > 关系运算符 结合性 优先级 举例 含义 符号 运算符
  • 30.
    逻辑运算真值表 ( 1)关系和逻辑运算符的关键是 True (真)和 False (假) ( 2 ) C 语言中,非 0 为真, 0 为假 0 0 1 1 0 0 1 0 0 1 1 0 1 0 1 0 0 1 1 1 0 0 1 1 p||q p&&q ! q ! p q p
  • 31.
    2.6.4 位运算符 按位运算时,必须将运算对象转化为二进制位运算必须是整型和字符型数据 从左向右 5 10<<2 按位左移 << 从左向右 5 10>>2 按位右移 >> 从右向左 2 ~5 按位反 ~ 从左向右 9 5^4 按位异或 ^ 从左向右 10 5|4 按位或 | 从左向右 8 5&4 按位与 & 结合性 优先级 举例 含义 符号
  • 32.
    2.6.5 条件运算符格式: 运算对象 1 ?运算对象 2 :运算对象 3 功能: 先判断 运算对象 1 的值是否为非 0 ,如果是非 0 ,其值为运算对象 2 的值,否则为运算对象 3 的值 a>b?a:b
  • 33.
    说明: 运算对象 1、运算对象 2 、运算对象 3 可以是任意类型,一般运算对象 1 为关系或逻辑运算对象的式子,其类型可以相同,也可以不相同。 条件运算符的优先级为 13 级 条件运算符的结合性是从右向左结合的
  • 34.
    2.6.6 逗号运算符定义: 用逗号把几个运算对象连接起来 格式: 运算对象 1 ,运算对象 2 ,…… ,运算对象 n 功能: 先计算运算对象 1 的值,再计算运算对象 2 的值,直到最后计算运算对象 n 的值 x=5*6 , x+10 a=3,b=4,a++,b++,a+b 40 9 说明: ( 1 )逗号运算符的优先级是 15 。 ( 2 )逗号运算符的结合性是从左向右
  • 35.
    2.6.7 赋值运算符赋值运算符: = 格式: 变量 = 运算对象 功能:把右边运算对象的值赋给左边变量 赋值运算符“ =” 和判断相等( == )的区别 赋值运算符的优先级为 14 级 赋值运算符的结合性是从右向左 赋值中的类型转换以左边变量的类型为主
  • 36.
    2.6.8 复合赋值运算符定义:复合赋值运算符是在赋值的同时,进行了运算 格式: 变量 OP= 运算对象 相当于:变量 = 变量 OP (运算对象) 优先级: 14 结合性:从右向左
  • 37.
    从右向左 14 x<<=5相当于 x=x<<5 按位左移赋值 <<= 从右向左 14 x>>=5 相当于 x=x>>5 按位右移赋值 >>= 从右向左 14 x|=5 相当于 x=x|5 按位或赋值 |= 从右向左 14 x^=5 相当于 x=x^5 按位异或赋值 ^= 从右向左 14 x&=5 相当于 x=x&5 按位与赋值 &= 从右向左 14 x%=5 相当于 x=x%5 取余赋值 %= 从右向左 14 x/=5 相当于 x=x/5 除赋值 /= 从右向左 14 x*=5 相当于 x=x*5 乘赋值 *= 从右向左 14 x-=5 相当于 x=x-5 减赋值 -= 从右向左 14 x+=5 相当于 x=x+5 加赋值 += 结合性 优先级 举例 含义 运算符
  • 38.
    2.7 表达式求值2.7.1 算术表达式 2.7.2 赋值表达式 2.7.3 关系表达式和逻辑表达式
  • 39.
    2.7.1 算术表达式定义: 用算术运算符号将运算对象(常量、变量、函数等)、圆括号连接起来的式子 25 X
  • 40.
  • 41.
    数学公式 的 C语言表示
  • 42.
    表达式值的类型 同一表达式中的不同类型常量及变量,均应转换为同一类型的量 C 语言的编译程序将所有操作数转换为与最高类型操作数同类型 自动类型转换
  • 43.
    强制类型转换 (类型名)(表达式) 原来变量的数据类型不发生变化(int)(x+y) (int)x+y (double)(3/2) (int)3.6 精度损失问题 较高类型向较低类型转换时可能发生
  • 44.
    例 2.8 :已知 int a=7 ; float x=2.5 , y=4.7 ;计算表达式的值
  • 45.
    2.7.2 赋值表达式定义: 赋值运算符将一个变量和表达式连接起来构成的式子 一般形式: < 变量 > = < 表达式 > 将表达式的值求出来,赋给左边的变量,使变量的值为表达式的值 a=3; d=func(); c=d+2; x=20/4;
  • 46.
    表达式的值的类型以变量的类型为主 int x ; x=10+30/7+1.5 double y ; y=10+30/7+100 赋值表达式的值又可以作为另外一个赋值表达式 赋值表达式也可以包含复合赋值运算符
  • 47.
    2.7.3 关系表达式和逻辑表达式关系表达式 :用关系运算符将两个运算对象(算术表达式、赋值表达式、关系表达式和逻辑表达式等)连接起来构成的式子 a+3>b+4 (a>b)>(c=2) (ch!=getchar()) 注:关系表达式的值是一个逻辑值,即“真”或“假” 例 2.9 : 求下面关系表达式的值 int a=0 ; double b=0.5 , x=0.3 ;求 a<=x<=b 5>2>7>8 int i=1, j=7,a ; a=i+(j%4!=0) ;求 a 0 0 2
  • 48.
    逻辑表达式 : 用逻辑运算符将运算对象连接起来的式子 逻辑表达式的值只能是“真”或“假” 表示逻辑运算结果:以数值 1 代表“真”,以数值 0 代表“假” 判断是否为“真”:以非 0 表示“真”,以 0 表示“假” ! 5 的值是 0 a=2&&b=4 的值是 1 a=0||b=2 的值是 1
  • 49.
    !a a&&b a||b !a||b 4&&0||2 5>3&&2||8<9-!0 ‘ c’&&‘d’ 例 2.10 : 已知 a=4 , b=5 ,求下面逻辑表达式的值
  • 50.
    短路表达式: 在逻辑表达式中不是所有的逻辑运算符都要被执行,只有在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符 例 a&&b&&c // 只在 a 为真时,才判别 b 的值; 只在 a 、 b 都为真时,才判别 c 的值 例 a||b||c // 只在 a 为假时,才判别 b 的值; 只在 a 、 b 都为假时,才判别 c 的值 例 a=1;b=2;c=3;d=4;m=1;n=1; (m=a>b)&&(n=c>d) // m=0 , n=1