C语言程序设计--第3讲 运算符与表达式
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C语言程序设计
第3讲
§3.1 变量
变量的值存放在特定存储单元中,在程序运行期
间,变量的值是可以改变的。
变量名对应着内存空间中的某个地址,由编译系
统给每一个变量名分配对应的内存地址。 从变量中取值,实际上是通过变量名找到相应的 内存地址,从该存储单元中读取数据。
变量定义
使用变量的基本原则
printf("k=%d, a=%d\n",k, a );
练习:写出下列程序的输出结果
#include "stdio.h"
int main()
a=1; a=1; a=1;
{
int a, b, c, k=2; b= (c=2) * a++ ; b= (1-a) * ++a ; k= ( ++ a )+( ++ a );
23.0000,再以精度的浮点数格式存储到变量f中。 将23赋给double型变量d,即执行 d=23,则将23转换 成浮点数, 然后以双精度浮点数形式存储到变量d中。
③ 将一个double型数据赋给float变量时,截取其 前面7位有效数字,存放到float变量的存储单元 (4个字节)中。但应注意数值范围不能溢出。
(2) 算术表达式: 用算术运算符和括号将运算对象(
也称操作数)连接起来的、符合C语法规则的式
子,称为C算术表达式。 运算对象包括常量、变量、函数等。
例如:
a*b/c-1.5+′a′ 2a*b+3c
合法的表达式 非法表达式
运算符的优先级
• C语言规定了运算符的优先级和结合性。
在表达式求值时,按运算符的优先级别高低次
(12)下标运算符([])
(13)其他 (如函数调用运算符())
ຫໍສະໝຸດ Baidu
§3.2.2 算术运算符和算术表达式
(1)基本的算术运算符:
+ (加法运算符,或正值运算符。如:3+5、+3) - (减法运算符,或负值运算符。如:5-2、-3) * (乘法运算符。 如:3*5)
/ (除法运算符。如:5/3)
% (模运算符,或称求余运算符),%两侧均应为整型数据,
变量赋初值
• • • • • • • • 对变量第一次赋值称为赋初值, 一般形式为: 类型说明符 变量1 = 值1,变量2 = 值2,……;
例如: int a=3; int b,c=5; float x=3.2,y=3f,z=0.75; char ch1='K',ch2='P'; 在定义中不允许连续赋值,如int a=b=c=5是不合法的。
变量必须先定义,后使用 所有变量必须在第一条可执行语句前定义
一条定义语句可定义若干个同类型的变量 定义变量,是初始化变量的最好时机
不被初始化的变量,其值为危险的随机数
char int int float
esc i = sum eps
= 'a'; 1; = 0; = 1.0e-5;
练习:写出以下程序的执行结果
如:
• • • • ++i, --i (在使用i之前,先使i的值加(减)1) i++,i-- (在使用i之后,使i的值加(减)1)
m = n++;
等价于
m = n--;
m=n; n=n-1; m = --n; n=n-1; m=n;
m=n; n=n+1;
m = ++n;
等价于
n=n+1; m=n;
⑤
将一个int、short、long型数据赋给一个char 型变量时,只将其低8位原封不动地送到char型 变量(即舍弃高位)。
char c=‘a’; c=i;
例如:int i=289;
c的值为33, 如果用“%c”输
出c,将得到字符“!” 。
p63
将带符号的整型数据(int型)赋给long型变量 时,要进行符号扩展,将整型数的16位送到 long型低16位中:
例如:对表达式
b = (1-a) * ++a ;
并不是所有的编译系统都先计算(1-a), 然后 计算 ++a 。
不同的编译器可能出现不同的结果。有时会出现一些令人容易
搞混的问题,因此务必小心谨慎。
不建议在一条语句同时出现需要计算并改变其值的变量。
②C语言中有的运算符为一个字符,有的运算符 由两个字符组成 ,为避免误解,最好采取大 家都能理解的写法。
短为无符号数、正数 长高位补零 短为负
长 短 : 截断(截取相应长度的低位)
短 长 :符号扩展
长高位补1
由于c语言使用灵活,在不同类型数据之间赋值时,常常会
出现意想不到的结果,而编译系统并不提示出错,全靠程序员的经
验来找出问题。这就要求编程人员知道这些赋值规则。
在学习这部分内容时不必死记,可以通过自学和上机实践来掌握。
(2)关系运算符 (> < == >= <= !=)
(3)逻辑运算符 (&& || ! )
(4)位运算符 (<< >> ~ | ∧ &)
(5)赋值运算符 (=及其扩展赋值运算符)
(6)条件运算符 (?:)
(7)逗号运算符 (,)
(8)指针运算符( *(指向) 和 &(取地址) ) (9)求字节数运算符( sizeof() ) (10)强制类型转换运算符( (类型) ) (11)分量运算符( . ->)
i++与++i的区别:
++i 先执行i=i+1, 再使用i的值; i++ 先使用i的值, 再执行i=i+1。
例如:设 i=3
①j= ++i; i的值先+1,变成4, 再赋给j, j的值为4 ②j=i++; 先将i的值3赋给j, j值为3,然后i=i+1=4
注意:
(1)自增运算符(++),自减运算符(--)包含 赋值操作,所以只能用于变量,而不能用于常量
①将浮点型数据(包括单、双精度)赋给整型变量时 ,舍弃浮点数的小数部分(并非4舍5入)。
如:i为整型变量,执行“i=3.56”的结果是使
i的值为3,以整数形式存储在整型变量中.
②将整型数据赋给单、双精度变量时,数值不变, 但以浮点数形式存储到变量中。
如: 将23赋给float变量f,即执行f=23,先将23转换成
写出下列程序运行结果
#include "stdio.h" void main()
{
int a=32767;
short b;
b=a+1; printf("%d\n", b); } 详见课本p63图3.16
赋值运算符
=
赋值运算符的作用是将一个数据赋给一个变量。
如“a=3”的作用 是执行一次赋值操作(或称赋值运算),把常 数3赋值给变量a。 如: a= 3*x+2/y+3*5; //千万不要写成3x+2/y 将一个表达式的值赋给一个变量。
注意:“=” 左侧只能是变量。
C语言的运算符:
(1)算术运算符 (+ - * / %)
如果int型数据为正值(符号位为0),则long 型变量的高16位补0; 如果int型变量为负值(符号位为1),则long 型变量的高16位补1,以保持数值不改变。 反之,若将一个long型数据赋给一个int型 变量,只将long型数据中低16位原封不动地送 到整型变量(即截断)。
不同类型的整型数据间的赋值规则归结为:
例如:i的初值为3,如果有下面的函数调用:
printf(″%d,%d″,i,i++) VC从左至右求值,输出“3,3”。 TC对函数参数的求值顺序是自右而左,输出“4,3”。 以上这种写法不宜提倡, 最好改写成 j = i++;
printf("%d, %d", j,i)
赋值时的类型转换 如果赋值运算符两侧的类型不一致,但都 是数值型或字符型时,在赋值时要进行类型 转换。
例如:不要写成 i+ + +j 的形式,
而应写成 (i+ +) +j的形式
练习:写出下列程序的输出结果
#include "stdio.h"
int main()
{ int a=3;
printf("%d, %d", a, a++);
return 0; }
③在调用函数时,参数的求值顺序,C标准并无统一规定。
写出下列程序的执行结果: #include <stdio.h> void main() { double x=3.6; int i; i = (int) x; printf("x=%lf, i=%f \n", x, (int) x); }
(4) 自增(++)、自减(--)运算符
作用是使变量的值增1或减1
• 强制转换
(类型关键字)表达式
•
int m=5;
(float)m/2; float (m)/2;
float m/2;
float (m/2);
• 表达式的结果被转换为设定的类型,但变量本身的类型和值 不变
练习:写出下列程序的执行结果: #include <stdio.h> void main() { double x=3.6; int i; i = (int) x; printf("x=%lf, i=%d\n", x,i); }
如: float f; double d=123.456789e100; f=d; 就出现溢出的错误。
如果将一个float型数据赋给double变量时,数值不
变,有效位数扩展到16位,在内存中以8个字节存储
④ 字符型数据赋给整型变量时,由于字符只占1个字节,而 ,所对应的ASCII码。 其十进制数值为 整型变量为2个字节,因此将字符数据(8个二进位) 放到整型变量存储单元的低8位中。 254,转换成二进制为 11111110 第一种情况: 如果所用系统将字符处理为无符号的字符类型,或程序已将 字符变量定义为 unsigned char型,则将字符的8位放
‘\376’ 表示为8进制数376所对应的十进制数
到整型变量低8位,高8位补零
例: int main() { int i; i= ‘\376’; printf(“%d”,i);}
第二种情况:
如果所用系统(如Turbo C++)将字符处理为带 符号的(即signed char), 若字符最高位为0,则整型变量高8位补0; 若字符最高位为1,则高8位全补1。 这称为“符号扩展”,这样做的目的是使数值保 持不变,如变量c(字符‘\376’)以整数形式 输出为-2,i的值也是-2。
printf("a=%d, b=%d\n", a, b);
printf("a=%d, b=%d\n", a, b); printf("k=%d, a=%d\n",k,a ); return 0; }
(5) 有关表达式使用中的问题说明 ①ANSI C并没有具体规定表达式中的子表达式的求 值顺序,允许各编译系统自己安排。
如:7%4的值为3)。
课堂练习:写出以下程序的执行结果 #include "stdio.h"
void main()
{ int a=7, b=3 ,c;
float x=8, y=2 ;
printf("a/b= %d\n", a/b); printf( "a%b= %d\n", a%b); printf("x/y = %f\n", x/y); // printf("x%y = %f\n", x%y); }
#include <stdio.h> int main() { int iGreen = 61, iYellow =202, iBlue; float fNum =1.0, fCount =2, fSum; printf("iGreen =%d, iYellow =%d, iBlue =%d\n\n", iGreen, iYellow, iBlue); return 0; } 注意:未初始化的变量, 其值为危险的随机数
序执行,例如先乘除后加减。
• C规定了各种运算符的结合方向(结合性)
算术运算符的结合方向为“由左至右”,即先 左后右 。
(3)强制类型转换运算符
强制类型转换运算符可以将一个表达式转换成
所需类型。 一般形式:(类型名)(表达式) 例如: • (double)a 将a的值转换成double类型 • (int)(x+y) 将x+y的值转换成整型 • (float)(5%3) 将5%3的值转换成float型
或表达式。
(2)++和--的结合方向是“自右至左”。
练习:写出下列程序的输出结果
int main() {
int a, b, c, k; a=1; b= a++ *(1-a) ;
printf("a=%d, b=%d\n", a, b); a=1; b= ++a *(1-a) ;
printf("a=%d, b=%d\n", a, b); a=1; k= ( a ++ )+( a++ ); }
第3讲
§3.1 变量
变量的值存放在特定存储单元中,在程序运行期
间,变量的值是可以改变的。
变量名对应着内存空间中的某个地址,由编译系
统给每一个变量名分配对应的内存地址。 从变量中取值,实际上是通过变量名找到相应的 内存地址,从该存储单元中读取数据。
变量定义
使用变量的基本原则
printf("k=%d, a=%d\n",k, a );
练习:写出下列程序的输出结果
#include "stdio.h"
int main()
a=1; a=1; a=1;
{
int a, b, c, k=2; b= (c=2) * a++ ; b= (1-a) * ++a ; k= ( ++ a )+( ++ a );
23.0000,再以精度的浮点数格式存储到变量f中。 将23赋给double型变量d,即执行 d=23,则将23转换 成浮点数, 然后以双精度浮点数形式存储到变量d中。
③ 将一个double型数据赋给float变量时,截取其 前面7位有效数字,存放到float变量的存储单元 (4个字节)中。但应注意数值范围不能溢出。
(2) 算术表达式: 用算术运算符和括号将运算对象(
也称操作数)连接起来的、符合C语法规则的式
子,称为C算术表达式。 运算对象包括常量、变量、函数等。
例如:
a*b/c-1.5+′a′ 2a*b+3c
合法的表达式 非法表达式
运算符的优先级
• C语言规定了运算符的优先级和结合性。
在表达式求值时,按运算符的优先级别高低次
(12)下标运算符([])
(13)其他 (如函数调用运算符())
ຫໍສະໝຸດ Baidu
§3.2.2 算术运算符和算术表达式
(1)基本的算术运算符:
+ (加法运算符,或正值运算符。如:3+5、+3) - (减法运算符,或负值运算符。如:5-2、-3) * (乘法运算符。 如:3*5)
/ (除法运算符。如:5/3)
% (模运算符,或称求余运算符),%两侧均应为整型数据,
变量赋初值
• • • • • • • • 对变量第一次赋值称为赋初值, 一般形式为: 类型说明符 变量1 = 值1,变量2 = 值2,……;
例如: int a=3; int b,c=5; float x=3.2,y=3f,z=0.75; char ch1='K',ch2='P'; 在定义中不允许连续赋值,如int a=b=c=5是不合法的。
变量必须先定义,后使用 所有变量必须在第一条可执行语句前定义
一条定义语句可定义若干个同类型的变量 定义变量,是初始化变量的最好时机
不被初始化的变量,其值为危险的随机数
char int int float
esc i = sum eps
= 'a'; 1; = 0; = 1.0e-5;
练习:写出以下程序的执行结果
如:
• • • • ++i, --i (在使用i之前,先使i的值加(减)1) i++,i-- (在使用i之后,使i的值加(减)1)
m = n++;
等价于
m = n--;
m=n; n=n-1; m = --n; n=n-1; m=n;
m=n; n=n+1;
m = ++n;
等价于
n=n+1; m=n;
⑤
将一个int、short、long型数据赋给一个char 型变量时,只将其低8位原封不动地送到char型 变量(即舍弃高位)。
char c=‘a’; c=i;
例如:int i=289;
c的值为33, 如果用“%c”输
出c,将得到字符“!” 。
p63
将带符号的整型数据(int型)赋给long型变量 时,要进行符号扩展,将整型数的16位送到 long型低16位中:
例如:对表达式
b = (1-a) * ++a ;
并不是所有的编译系统都先计算(1-a), 然后 计算 ++a 。
不同的编译器可能出现不同的结果。有时会出现一些令人容易
搞混的问题,因此务必小心谨慎。
不建议在一条语句同时出现需要计算并改变其值的变量。
②C语言中有的运算符为一个字符,有的运算符 由两个字符组成 ,为避免误解,最好采取大 家都能理解的写法。
短为无符号数、正数 长高位补零 短为负
长 短 : 截断(截取相应长度的低位)
短 长 :符号扩展
长高位补1
由于c语言使用灵活,在不同类型数据之间赋值时,常常会
出现意想不到的结果,而编译系统并不提示出错,全靠程序员的经
验来找出问题。这就要求编程人员知道这些赋值规则。
在学习这部分内容时不必死记,可以通过自学和上机实践来掌握。
(2)关系运算符 (> < == >= <= !=)
(3)逻辑运算符 (&& || ! )
(4)位运算符 (<< >> ~ | ∧ &)
(5)赋值运算符 (=及其扩展赋值运算符)
(6)条件运算符 (?:)
(7)逗号运算符 (,)
(8)指针运算符( *(指向) 和 &(取地址) ) (9)求字节数运算符( sizeof() ) (10)强制类型转换运算符( (类型) ) (11)分量运算符( . ->)
i++与++i的区别:
++i 先执行i=i+1, 再使用i的值; i++ 先使用i的值, 再执行i=i+1。
例如:设 i=3
①j= ++i; i的值先+1,变成4, 再赋给j, j的值为4 ②j=i++; 先将i的值3赋给j, j值为3,然后i=i+1=4
注意:
(1)自增运算符(++),自减运算符(--)包含 赋值操作,所以只能用于变量,而不能用于常量
①将浮点型数据(包括单、双精度)赋给整型变量时 ,舍弃浮点数的小数部分(并非4舍5入)。
如:i为整型变量,执行“i=3.56”的结果是使
i的值为3,以整数形式存储在整型变量中.
②将整型数据赋给单、双精度变量时,数值不变, 但以浮点数形式存储到变量中。
如: 将23赋给float变量f,即执行f=23,先将23转换成
写出下列程序运行结果
#include "stdio.h" void main()
{
int a=32767;
short b;
b=a+1; printf("%d\n", b); } 详见课本p63图3.16
赋值运算符
=
赋值运算符的作用是将一个数据赋给一个变量。
如“a=3”的作用 是执行一次赋值操作(或称赋值运算),把常 数3赋值给变量a。 如: a= 3*x+2/y+3*5; //千万不要写成3x+2/y 将一个表达式的值赋给一个变量。
注意:“=” 左侧只能是变量。
C语言的运算符:
(1)算术运算符 (+ - * / %)
如果int型数据为正值(符号位为0),则long 型变量的高16位补0; 如果int型变量为负值(符号位为1),则long 型变量的高16位补1,以保持数值不改变。 反之,若将一个long型数据赋给一个int型 变量,只将long型数据中低16位原封不动地送 到整型变量(即截断)。
不同类型的整型数据间的赋值规则归结为:
例如:i的初值为3,如果有下面的函数调用:
printf(″%d,%d″,i,i++) VC从左至右求值,输出“3,3”。 TC对函数参数的求值顺序是自右而左,输出“4,3”。 以上这种写法不宜提倡, 最好改写成 j = i++;
printf("%d, %d", j,i)
赋值时的类型转换 如果赋值运算符两侧的类型不一致,但都 是数值型或字符型时,在赋值时要进行类型 转换。
例如:不要写成 i+ + +j 的形式,
而应写成 (i+ +) +j的形式
练习:写出下列程序的输出结果
#include "stdio.h"
int main()
{ int a=3;
printf("%d, %d", a, a++);
return 0; }
③在调用函数时,参数的求值顺序,C标准并无统一规定。
写出下列程序的执行结果: #include <stdio.h> void main() { double x=3.6; int i; i = (int) x; printf("x=%lf, i=%f \n", x, (int) x); }
(4) 自增(++)、自减(--)运算符
作用是使变量的值增1或减1
• 强制转换
(类型关键字)表达式
•
int m=5;
(float)m/2; float (m)/2;
float m/2;
float (m/2);
• 表达式的结果被转换为设定的类型,但变量本身的类型和值 不变
练习:写出下列程序的执行结果: #include <stdio.h> void main() { double x=3.6; int i; i = (int) x; printf("x=%lf, i=%d\n", x,i); }
如: float f; double d=123.456789e100; f=d; 就出现溢出的错误。
如果将一个float型数据赋给double变量时,数值不
变,有效位数扩展到16位,在内存中以8个字节存储
④ 字符型数据赋给整型变量时,由于字符只占1个字节,而 ,所对应的ASCII码。 其十进制数值为 整型变量为2个字节,因此将字符数据(8个二进位) 放到整型变量存储单元的低8位中。 254,转换成二进制为 11111110 第一种情况: 如果所用系统将字符处理为无符号的字符类型,或程序已将 字符变量定义为 unsigned char型,则将字符的8位放
‘\376’ 表示为8进制数376所对应的十进制数
到整型变量低8位,高8位补零
例: int main() { int i; i= ‘\376’; printf(“%d”,i);}
第二种情况:
如果所用系统(如Turbo C++)将字符处理为带 符号的(即signed char), 若字符最高位为0,则整型变量高8位补0; 若字符最高位为1,则高8位全补1。 这称为“符号扩展”,这样做的目的是使数值保 持不变,如变量c(字符‘\376’)以整数形式 输出为-2,i的值也是-2。
printf("a=%d, b=%d\n", a, b);
printf("a=%d, b=%d\n", a, b); printf("k=%d, a=%d\n",k,a ); return 0; }
(5) 有关表达式使用中的问题说明 ①ANSI C并没有具体规定表达式中的子表达式的求 值顺序,允许各编译系统自己安排。
如:7%4的值为3)。
课堂练习:写出以下程序的执行结果 #include "stdio.h"
void main()
{ int a=7, b=3 ,c;
float x=8, y=2 ;
printf("a/b= %d\n", a/b); printf( "a%b= %d\n", a%b); printf("x/y = %f\n", x/y); // printf("x%y = %f\n", x%y); }
#include <stdio.h> int main() { int iGreen = 61, iYellow =202, iBlue; float fNum =1.0, fCount =2, fSum; printf("iGreen =%d, iYellow =%d, iBlue =%d\n\n", iGreen, iYellow, iBlue); return 0; } 注意:未初始化的变量, 其值为危险的随机数
序执行,例如先乘除后加减。
• C规定了各种运算符的结合方向(结合性)
算术运算符的结合方向为“由左至右”,即先 左后右 。
(3)强制类型转换运算符
强制类型转换运算符可以将一个表达式转换成
所需类型。 一般形式:(类型名)(表达式) 例如: • (double)a 将a的值转换成double类型 • (int)(x+y) 将x+y的值转换成整型 • (float)(5%3) 将5%3的值转换成float型
或表达式。
(2)++和--的结合方向是“自右至左”。
练习:写出下列程序的输出结果
int main() {
int a, b, c, k; a=1; b= a++ *(1-a) ;
printf("a=%d, b=%d\n", a, b); a=1; b= ++a *(1-a) ;
printf("a=%d, b=%d\n", a, b); a=1; k= ( a ++ )+( a++ ); }