Professional Documents
Culture Documents
达式
白 雪 飞
baixf@ustc.edu.cn
中国科学技术大学电子科学与技术系
Dept. of Elec. Sci. & Tech., USTC
Fall, 2003
目 录
数据类型、常量和变量的定义
运算符的种类、优先级和结合方向
表达式的类型和求值
简单的 C 程序设计及基本输入输出
据结构
C 语言的数据有常量和变量之分
常量和变量都分别属于某一数据类型
程序中用到的所有数据都必须指定类型
本章仅介绍基本数据类型
变量在存储器中占据一定的存储单元
变量占据存储空间的大小由其类型决定
变量名表示存储变量的存储单元地址
程序使用变量名表示这个变量所占据的
存储单元里存储的数据的值
变量要“先定义,后使用”
变量名
a
34 变量值
存储单元 ( 地址 )
整型数据在内存中的存放形式
整型变量的类型
整型变量的定义
整型数据的溢出
整型常量的类型
高地址字节 低地址字节
补码 (Complement)
正数:与原码一致,首位为 0
负数:绝对值取反加一,首位为 1
零:各位全为 0
C语言程序设计 - 第2章 数据类型、运算符和表达式 13
补码举例
举例
int i=-50; /*int 类型占 2 字节 */
50 的原码 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0
取反
1 1 1 1 1 1 1 1 1 1 0 0 1 1 0 1
加一
-50 的补码 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 0
直接使用常量
带有 l 、
L 、 u 、 U 等后缀的整型常量一
般用于函数调用
不带有后缀的整型常量的类型,是根据其数
值大小所处的范围来确定的
浮点型数据在内存中的存放形式
浮点型变量的类型
浮点型数据的舍入误差
浮点型常数的类型
指数部分长度与能表示的数值范围有关
1 1 0 1 1 0 0 1 1 0 1 1 0 0 1 0
符号 指数部分 e 小数部分 f
s
v = (−1) (1. f ) × 2
s e
float a=123456.789e5, b;
b = a + 20; /*b=12345678920?*/
printf("a=%f\nb=%f\n", a, b);
字符型数据在内存中的存放形式
字符型数据的使用方法
字符串常量
void main()
{
char c1, c2; /* 定义字符型变量 c1 和 c2*/
c1='a' c1='2'
(ASCII=97) (ASCII=50)
01100001 00110010
字符型数据的存放形式与只占一个字节
长度的整型数据完全相同
unsigned
char c;
举例,表示一个班级的人数 (<256)
赋值和使用中需要注意的问题,与整型
变量相同
'\0') 作为字符串结束标志
字符串结束标志 '\0' 是不能显示的,在
字符串常量中,也不用显式写出来
举例
"" \0 00
"a" 'a' \0 97 00
int a=1;
/* 相当于 int a; a=1;*/
int a, b=3;
/* 对 b 赋初值, a 没有初值 */
int b, c, a=b=c=100;
/* 对三个变量赋同样的初值 */
变量使用前,一般应先对它赋值
C语言程序设计 - 第2章 数据类型、运算符和表达式 42
各类数值型数据间的混合运算
整型、字符型、浮点型数据可混合运算
混合运算时,不同类型的数据按照一定
的规则先转换为同一类型,然后再运算
高 double float
long
unsigned
运算符的结合方向
/* 先算乘除,后算加减 */
/* 乘除比加减优先级高 */
(a+b)*(c-d)/e
/* 先算加减,后算乘除 */
C语言程序设计 - 第2章 数据类型、运算符和表达式 47
运算符的结合方向 (Associativity)
结合方向
当一个操作数两侧的运算符优先级相同时,
运算次序按照结合方向的规定进行
举例
a+b-c
/*+ 和 - 的结合方向都是从左向右 */
/*b 先与 + 结合计算 a+b ,然后执行减法
*/
a=b=1
/*= 的结合方向是从右向左,先计算
C语言程序设计 - 第2章 数据类型、运算符和表达式 48
运算符的结合方向规则
单目运算符的结合方向都是“从右向左
”
!、 ~ 、 ++ 、 -- 、 +( 正号 ) 、 -( 负号 )
*( 指针运算符 ) 、 &( 地址运算符 )
sizeof 、 (type)
赋值运算符的结合方向是“从右向左”
三目运算符的结合方向是“从右向左”
唯一的三目运算符:条件运算符 ?:
其他运算符的结合方向都是“从左向右
” C语言程序设计 - 第2章 数据类型、运算符和表达式 49
优先级与结合方向总结
不同优先级的运算符,运算次序按优先
级由高到低执行
同一优先级的运算符,运算次序按结合
方向的规定执行
可以使用圆括号 ( ) 明确运算次序
圆括号 () 具有最高的优先级
表达式求值
算术运算符和算术表达式
赋值运算符和赋值表达式
逗号运算符和逗号表达式
/* 混合类型算术运算,值为 double 类型
*/
!((a<1e-6)&&(b==(c+sqrt(f))))
/* 逻辑判断的结果是逻辑值 */
/*C 语言用整型表示逻辑类型 */
C语言程序设计 - 第2章 数据类型、运算符和表达式 53
算术运算符 (Arithmetic
Operators)
基本算术运算符
+ - * / %
强制类型转换运算符
( 类型名 )
自增、自减运算符
++ --
int c, i;
putchar('a'); /* 输出 'a' */
putchar('\n'); /* 输出换行符 */
putchar(101); /* 输出 'e' */
putchar('\101'); /* 输出 'A' */
c = 1000;
i = putchar(c); /* 输出 'è' , i=232 */
int c;
int i=1234;
float f=-56.78;
printf("i=%+6d", i); /* "i=+1234" */
printf("%c", i); /* "ò" */
printf("%#08x", i); /* "0x0004d2" */
printf("%10.5E", f); /* "-5.67800E+01" */
printf("%7.4f%%", f);/* "-56.7800%" */
printf("%+6.3G", f); /* "-56.8" */
printf("%-6.3s", "Hello"); /* "Hel " */
h 有符号或无符号短整型
l 有符号或无符号长整型或双精度型
L 长双精度型
m 一个正整数,输入数据的最大宽度
* 需要输入数据,但是在赋值时被跳过
void main()
{
float r, V;
printf("r=");
scanf("%f", &r);
V = 4.0 / 3 * PI * r * r * r;
printf("V=%f\n", V);
}
C语言程序设计 - 第2章 数据类型、运算符和表达式 83
例 2 :字母大小写转换 (02-06.C)
#include <stdio.h>
void main()
{
char cup, clow;
cup = getchar();
clow = cup + 'a' - 'A';
printf("%c\n", clow);
}
The End