文档库 最新最全的文档下载
当前位置:文档库 › C语言类型转换、运算符与表达式

C语言类型转换、运算符与表达式

第一部分:复习
1、编程语言经历了机器语言、汇编语言、高级语言和自然语言四个过程。
高级语言分为:
面向过程的(如C语言)、面向对象的(如C++,JAVA等)
编译型语言(如C和C++等)、解释型语言(如Python等脚本语言)
2、如何将hello.c生成可执行文件:
gcc hello.c -o hello 或 gcc hello.c(会生成a.out文件)
3、如何执行可执行文件:
./hello 或 ./a.out
4、C语言程序从代码到可执行程序经历了四步:预处理、编译、汇编、链接
5、标识符的命名规则:
⒈标识符只能由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线;
⒉C 语言中的标识符大小写敏感;
⒊用户自定义的标识符不能与关键字同名
6、变量类型与大小:
int型:4字节
long类型:4字节
short类型:2字节
char类型:1字节
float类型:4字节
double类型:8字节
7、输出变量:
%d:十进制输出
%o:八进制输出
%x或%X:十六进制输出
%c:字符输出
%f:浮点数十进制形式输出
%e:浮点数指数计数形式输出
8、转义字符:
\n:换行
\t:tab制表符
\\:输出\
9、宏定义常量与常变量:
#define宏定义常量
const int int型常变量

第二部分:类型转换
1、隐式类型转换(自动转换)
在有多种数据类型混合计算的时候,若未人为控制类型,系统会自动进行类型转换
转换的规则是:存储长度较短的转换成存储长度较长的,且不丢失数据
char--->short--->int--->unsigned int--->long--->unsigned long--->double

float--------
练习:思考以下程序的输出结果
int main()
{
int a = 1;
unsigned int b = -6;
if(a+b>0)
{
printf("yes\n");
}
else
{
printf("no\n");
}
return 0;
}
答案:输出yes
思考:对于a+b来说,计算结果如果使用%d格式进行打印,则会输出-5;若以%u形式打印,则会输出一个很大的正整数。思考这是为什么。

2、赋值转换
如果赋值运算符两侧数据类型不一致,则在赋值时会发生赋值类型转换
1)int型与float型
将float类型赋值给int型时,会舍去小数部分。如:
int a = 3.5;
//此时a的值是3
将int类型赋值给float型时,数值会以float类型存储。如:
float f = 4;
//此时f的值是4.0
2)float型与double型
将double型赋值给float型时,截取7位有效数字存储在float类型中。但要注意不要超过float类型的存储范围(因为double类型存储范围比float类型大)
3)char型与int型
将int类型赋值给char类型时,直接截取低8位存储在char型中。
将char类型赋值给int类型时,分两种情况:
⑴无符号char类型(即unsigned char型),数据存储在int类型低8位,剩下24位补0
⑵有符号char类型,数据存储在int型低8位。若

char首位是0,则int型剩下24位补0;若char首位是1,则int型剩下24位补1。
4)int型与long类型(只考虑int型与long类型长度不一致情况)
将long类型赋值给int类型时,直接截断数据,将低位原封不动存储在int型中。
将int类型赋值给long类型时,分两种情况:
⑴无符号int类型(即unsigned int型),数据存储在long类型低位,剩下位补0
⑵有符号int类型,数据存储在long类型低位。若int首位是0,则剩下位补0;若int首位是1,则剩下位补1。

3、强制类型转换
隐式类型转换或赋值转换有时不会得到我们预期的结果,这时我们可以使用强制类型转换来实现我们想要的类型转换结果。
强制类型转换:人为地将某类型转换为另一类型
强制类型转换符:()括号
用法:
(待转换的类型)变量
例如:
float a = 3.5;
(int)a;//将a强制转换成int类型

float pi = 3.1415926;
int x = (int)pi;
在这里x会变成3,而pi还是原数值(3.1415926)。即经过赋值运算后,pi的类型又变回浮点数,pi的值不会变。
练习:从键盘输入5个学生的成绩(整数),要求输出总成绩(整数)和平均成绩(小数)
答案:
int main()
{
int sum=0,input=0;
float avg;
scanf("%d",&input);
sum = sum + input;

scanf("%d",&input);
sum = sum + input;

scanf("%d",&input);
sum = sum + input;

scanf("%d",&input);
sum = sum + input;

scanf("%d",&input);
sum = sum + input;
printf("总成绩是%d\n",sum);
avg = (float)sum/5;
printf("平均成绩是%f\n",avg);
return 0;
}

/*************学过C语言的同学建议使用循环输入***************************/
int main()
{
int sum=0,input=0;
int i;
for(i=0;i<5;i++)
{
scanf("%d",input);
sum += input;
}
printf("%d\n",sum);
printf("%f\n",(float)sum/5);
return 0;
}

/***********对C语言精通的同学建议使用数组存储输入数据*******************/
int main()
{
int input[5]={0};
int i;
int sum = 0;
for(i=0;i<5;i++)
{
scanf("%d",input[i]);
sum += input[i];
}
printf("%d\n",sum);
printf("%f\n",(float)sum/5);
return 0;
}

第三部分:运算符与表达式
1、表达式
用运算符和括号将操作数连接起来的符合C语言语法规则的句子称为表达式。
如2*y+5中,*和+是运算符,2,y,5是操作数,整个句子符合C语言语法规则。
2、运算符
运算符用于执行程序代码运算,对一个以上的操作数进行运算。
在C语言中,运算符需要至少1个操作数(不超过3个)
在C语言中,把除了控制语句(如if,for等)和输入输出语句以外的几乎所有的基本操作都当做运算符处理。
3、运算符的分类
1)根据结合数的数目分类:
单目运算符:即操作数只有1个的运算符
双目运算符:即操作数有2个的运算符
三目运算符:即操作数有3

个的运算符,只有一个( ?: )
2)根据运算符的用途分类:
赋值运算符:如=及其扩展运算符
逻辑运算符:如&&(与)、||(或)、!(非)
算数运算符:如+ - * / %等
关系运算符:如> < >= <= == !=等
位运算符:如<< >>等
条件运算符:只有一个 ?:
逗号运算符:只有一个 , 用于分隔
……
4、运算符的结合顺序
运算符有两种结合顺序:自左至右、自右至左
自左至右(左结合性):表示运算符的操作数是从左向右(先左再右)与运算符结合的,如加法+
例:3 + 5,即3加上5,先取3,再取+,再取5
自右至左(右结合性):表示运算符的操作数是从右向左(先右再左)与运算符结合的,如赋值=
例:a = 3,即先取数3,再给a赋值
5、运算符的优先级
C语言中运算符有优先级,从高到低分为15级(不同书籍划分方式不同,级数不同,这里采用百度百科划分方式),1级优先级最高,15级最低。
混合运算时,先算优先级高的,再算优先级低的(类比数学中,先算乘除,再算加减),同等级运算符则从左向右依次运算

6、算数运算符
符号及含义:+(加) -(减) *(乘) /(除) %(取余)
数目:双目运算符
结合性:自左至右
优先级:+和-:4级。*和/和%:3级
使用方法:表达式 运算符 表达式。如:3+5 a-b等
注意:
⒈C语言中,若相除2个数都是整数,则计算/时只取商,余数部分被舍去。
⒉%的操作数必须是整数
练习1:输入以下程序,查看输出结果
int main()
{
int a = 22;
int b = 5;
printf("%d\n",a/b);
return 0;
}
练习2:在练习1基础上,将变量类型改成float类型,查看输出结果
int main()
{
float a = 22;
float b = 5;
printf("%f\n",a/b);
return 0;
}
练习3:读以下程序,猜想输出的结果,再执行程序检验自己的猜想
#include
int main()
{
double y;
float a = 2.0;
int b =6,c=3;
y = a*b/c-1.5+'A';
printf("%f\n",y);
return 0;
}

7、正运算符与负运算符
符号及含义:+(正数) -(负数)
数目:单目运算符
结合性:自右至左
优先级:2级
使用方法:+表达式 或 -表达式。如:
int a = 3;
printf("%d\n",-a);//对a取负数,会输出-3

8、关系运算符
符号及含义:>(大于) <(小于) >=(大于等于) <=(小于等于) ==(判等) !=(不等)
数目:双目运算符
结合性:自左至右
优先级:> < >= <=:6级。==和!=:7级
使用方法:表达式 运算符 表达式。如3<5,a==7等
注意:
⒈关系运算符只会返回0或1两个值。其中返回0代表假,返回1代表真。
练习1:输入以下程序,查看输出结果并思考为什么
int main()
{
int a = 3;
if(4>a>2)
{
printf("a is %d\n",a);
}
else
{
printf("error!\n");
}

return 0;
}
⒉在C语言中,所有非0的数代表真,0代表假。
练习2:输入以下程序,查看输出结果
int main()
{
int a = 100;
if(a)
{
printf("true\n");
}
else
{
printf("false\n");
}
a = 0;
if(a)
{
printf("true\n");
}
else
{
printf("false\n");
}
a = -100;
if(a)
{
printf("true\n");
}
else
{
printf("false\n");
}
return 0;
}
/*************练习题2,对于熟练使用C语言的同学建议使用?:表达式**************/

⒊注意判断两个表达式相等的运算符是==,与=(赋值运算符)要分开

9、自增运算符与自减运算符
符号及含义:++(自增) --(自减)
数目:单目运算符
结合性:自左至右 或 自右至左(取决于表达式位置)
优先级:2级
使用方法:
自增;表达式++ 或 ++表达式。如a++ 或 ++a
自减:表达式-- 或 --表达式。如b-- 或 --b
注意:
⒈自增自减运算符表示将表达式+1或-1。如:
int a = 3;
a++;
a会变成4。
⒉注意++/--运算符与+/-(正数/负数运算符)是同等优先级。当这两个运算符一起使用时,是右结合性。即-a++ <---等价于---> -(a++);
⒊++在前与++在后的区别(--同理):
++在后(如a++):先使用数,再加1
++在前(如++a):先加1,再使用数
若单独使用自增运算符时,a++ <---等价于---> ++a <---等价于---> a=a+1 <---等价于---> a += 1(见下)
练习1:思考以下问题,之后编写程序观察输出结果
若有int a = 3,b;
⒈b = a++ 与 b = ++a,b的值相同么?
⒉b = -a++的结果是什么?
答案:
⒈不同。第一个b=3,第二个b=4。
⒉b=-3。
练习2:若有int i=10;思考
⒈i+++i+++i的结果是多少?
⒉运算后i的值是多少?
答案:⒈33 ⒉12
提示:算式等价于:i++ + i++ + i
练习3:读以下程序,猜想输出的结果,再执行程序检验自己的猜想
#include
int main()
{
int i = 8,j = 10,k = 12;
int m,n,p;

m = ++i;
n = j--;
p = (++m)*(n++)+(--k);
printf("i=%d,j=%d,k=%d\n",i,j,k);
printf("m=%d,n=%d,p=%d\n",m,n,p);
return 0;
}
答案:输出
i=9,j=9,k=11
m=10,n=11,p=111

10、逻辑运算符
符号及含义:&&(逻辑与) ||(逻辑或) !(逻辑非)
数目:!为单目运算符,&&和||为双目运算符
结合性:!为自右至左,&&和||为自左至右
优先级:!:2级。&&:11级。||:12级
使用方法:
⒈&&和||:表达式 运算符 表达式。如:a&&b a||b
⒉!:!表达式。如!a
注意:
逻辑运算符用于计算表达式的逻辑关系
⒈逻辑与:当且仅当两个表达式都为真时,则计算结果为真。否则为假
⒉逻辑或:当且仅当两个表达式都为假时,则计算结果为假。否则为真
⒊逻辑非:当原表达式为真时,计算结果为假;当原表达式为假时,计算结果为真
⒋逻辑运算符的返回结果

同关系运算符,计算结果为真返回1,计算结果为假返回0
练习1:若要使得内容8的练习题1能够正确输出,则需要怎样改变程序?
答案:
int main()
{
int a = 3;
if(a>2 && a<4)
{
printf("a is %d\n",a);
}
else
{
printf("error\n");
}
return 0;
}
练习2:将内容8的练习题2的所有if(a)改写成if(!a),执行程序查看结果
/************************逻辑运算符的短路现象*****************************/
当多个逻辑运算符连续使用的时候,会出现逻辑运算符短路的情况
1、与(&&)运算符短路
表达式1 && 表达式2 && 表达式3
当表达式1是真时,才会去判断表达式2的真/假。否则,如果表达式1是假,则之后的都不会进行运算。
当表达式2是真时,才会去判断表达式3的真/假。否则,如果表达式2是假,则之后的都不会进行运算。
示例:
int a=0,b=1,c=2,d;
d = a++ && b-- && ++c;
程序的执行结果是
a->1,b->1,c->2,d->0
分析:
⒈首先会计算a++,计算a++会首先取出a的值,此时a的值是0
⒉因为此时a的值是0,表达式1(a++)的位置是假,发生短路,后面的表达式2(b--)和表达式3(++c)都不会进行运算,此时返回假(0),赋值给d
⒊执行a++(a的值加1)
2、或(||)运算符短路
表达式1 || 表达式2 || 表达式3
当表达式1是真时,跳过判断表达式2和表达式3,直接返回真;当表达式1是假时,才去判断表达式2的真/假
当表达式2是真时,跳过判断表达式3,直接返回真;当表达式2是假时,才去判断表达式3的真/假
示例:
int a=0,b=1,c=2,d;
d = a++ || b-- || ++c;
程序的执行结果是
a->1 b->0 c->2 d->1
分析:
⒈首先会计算a++,计算a++会首先取出a的值,此时a的值是0
⒉因为此时a的值是0,表达式1(a++)的位置是假,需要判断表达式2(b--)的值
⒊计算b--,首先取出b的值,此时b的值是1
⒋因为此时b的值是1,表达式2(b--)的位置是真,发生短路,无需判断表达式3(++c)的真/假,此时返回真(1),赋值给d
⒌执行a++(a的值加1)和b--(b的值减1)

思考1:
如若将以上2个示例改写成:
d = a++ || b-- && ++c;
程序的执行结果是什么?先猜想结果,再上机验证
答案:
a->1 b->0 c->3 d->1
思考2:
如若将以上2个示例改写成:
int a=1,b=2,c=3,d;
d = a++ || b-- && ++c;
程序的执行结果是什么?先猜想结果,再上机验证
答案:
a->2 b->2 c->3 d->1
注意:这里要特别注意&&的运算优先级比||高。运算优先级高并不代表会先运算,而是代表先与操作数结合。而整个算式还是按照自左至右顺序计算。
在示例2中,因为&&的优先级比||高,因此算式等价于:
d = a++ || (b-- && ++c);
此时进行自左至右的运算,当遇到a为真(1)的时候,整个算式

发生了短路,括号内的b--和++c都不会执行
在这里要特别注意运算优先级高不代表会先运算,而是代表先与操作数结合
/***********************逻辑运算符的短路现象end***************************/
练习3:设
int a=3,b=4,c=5,d;
分别求出下列表达式的d的值(即判断此表达式真假)
1)d = a+b>c && b==c
2)d = a || b+c && b-c
3)d = !(a>b) && !c || 1
4)d = !(x=a)&&(y=b)&&0(x和y均为int型,求出x和y的值)
5)d = !(a+b)+c-1 && b+c/2
答案:
1)d=0
2)d=1
3)d=1
4)d=0,x=3,y未知
5)d=1

11、赋值运算符及复合赋值运算符
符号及含义:=(赋值) +=(加后赋值) -=(减后赋值) *=(乘后赋值) /=(除后赋值) %=(取余后赋值) <<=(左移后赋值) >>=(右移后赋值) &=(按位与后赋值) ^=(按位异或后赋值) |=(按位或后赋值)
数目:未知(取决于是否存在多重赋值)
结合性:自右至左
优先级:14级
使用方法:
一次赋值:待赋值 运算符 表达式。如a=3,a=5+4,a+=5等
多重赋值:将同一个值赋给多个变量的操作,如a=b=c=10。此时a,b,c都为10
复合赋值:先将左值取出,之后与右值进行运算(运算取决于运算符),将运算后的结果再赋值给左值。如:a += 3 -----> a = a + 3
练习:思考以下问题,之后编写程序观察输出结果
⒈int a = 2,b = 3,c = 4;
a *= b+c;
问:a的值是多少?
⒉int a = 3;
a += a *= a;
问:最后a的值是多少?
答案:⒈a的值是14。a *= b+c -----> a = a*(b+c);
⒉a的值是18。a += a *= a ---> 先算a = a*a(此时a是9),再算a = a+a(此时a是18)

12、条件运算符
符号及含义:?:(判断?前表达式是否成立,若成立取:前表达式,否则取:后表达式)
数目:三目运算符(C语言中唯一的三目运算符)
结合性:自右至左
优先级:13级
使用方法:表达式1?表达式2:表达式3。先判断表达式1是否成立,若成立取表达式2,否则取表达式3。
条件运算符相当于小型的if-else表达式
练习1:读以下程序,先说明程序的功能,再输入程序并执行验证自己的猜想
int main()
{
int max,a,b;
scanf("%d %d",&a,&b);
max = a>b?a:b;
printf("%d\n",max);
return 0;
}
练习2:读以下程序,猜想输出的结果,再执行程序检验自己的猜想
int main()
{
int a = 2,b = 3;
printf("%d\n",--a==b++?a++:b++);
//思考:当程序执行到这里,a的值和b的值都是多少?
return 0;
}

13、长度运算符
符号及含义:sizeof()(计算括号内数据类型或表达式的大小)
数目:无
结合性:无
优先级:2级
使用方法:sizeof(表达式) 或 sizeof(类型名)
sizeof()用于计算某类型或某表达式所占内存的大小,经常与结构体/数组等连同使用

14、位运算符
注意:位运算符的操作数只能

是整数或字符型数。当操作数进行位运算的时候,操作数转换为2进制数。
1)按位运算符
符号及含义:&(按位与) ^(按位异或) |(按位或) ~(按位取反)
数目:&和^和|:双目运算符。~:单目运算符。
结合性:&和^和|:自左至右。~:自右至左
优先级:
~:2级
&:8级
^:9级
|:10级
使用方法:按位运算会先将操作数转换成2进制数,对每一个位(bit)进行运算
按位与&:1&1=1 1&0=0 0&1=0 0&0=0(当且仅当全是1时值才为1,否则为0)
按位异或^:1^1=0 1^0=1 0^1=1 0^0=0(当且仅当两个数不相同时值才为1,否则为0)
按位或|:1|1=1 1|0=1 0|1=1 0|0=0(当且仅当全是0时值才为0,否则为1)
按位取反~:1-->0 0-->1(若是1则变成0,若是0则变成1)
注意:要将&(按位与)和&&(逻辑与)、|(按位或)和||(逻辑或)区分开
练习1:读以下程序,思考程序逻辑,猜想程序的功能,之后上机检验
#include
int main()
{
int a = 2,b = 3;
a ^= b;
b ^= a;
a ^= b;
printf("%d\n%d\n",a,b);
return 0;
}
答案:三步异或法可以实现交换2个整数
(交换2个整数的3种方法:申请中间变量法;三步异或法;加和分减法)
练习2:思考如何使用按位操作使一个数清零
答案:将这个数&0即可 或 将这个数^自身
练习3:在不使用%2的情况下,如何判断一个整数是奇数还是偶数?
答案:将这个整数与1做按位与计算,若结果是1则是奇数,若结果是0则是偶数
练习4:思考(6&6)>4 和 6&6>4的结果一样吗?为什么?
答案:(6&6)>4的结果是true,6&6>4的结果是0。因为>的优先级高于&,若不加括号则会先计算6>4(结果是1),然后计算6&1(结果是0)
练习5:如何将一个数的所有位进行翻转?如0x0f--->0xf0(1变0,0变1)
答案:将这个数与所有位全是1的数做异或运算
0x0f ^ 0xff ---> 0xf0
在进行位运算时一定要注意运算符优先级。对于不确定优先级的,我们要学会使用()来分隔运算符和操作数

2)移位运算符
符号及含义:<<(左移) >>(右移)
数目:双目运算符
结合性:自左至右
优先级:5级
使用方法:表达式1 左移/右移 表达式2。如a<<3
左移/右移运算符是先将操作数转换成2进制数,然后将这个数向左/右位移x(表达式2的值)位
左移的高位会溢出,直接舍去。低位会补0
右移的低位会溢出,直接舍去。高位补0还是补1见以下规则:
⒈对于无符号数,高位补0
⒉对于有符号数,若为非负数(即最高位(符号位)是0),则高位也是补0。若为负数,在高位补0还是补1取决于系统。补0的称之为“逻辑右移”,补1的称之为“算数右移”
对于整数,左移x位相当于乘2的x次方,右移x位相当于除2的x

次方
练习1:输入以下程序,查看输出结果
int main()
{
int a = 64;
a = a<<4;
printf("%d\n",a);
a = 64;
a = a>>4;
printf("%d\n",a);
return 0;
}
练习2:使用位运算符计算,输入整数k和num,计算以下内容:
⒈取出num的第k位的数
⒉将num的第k位置0

位运算符的操作是非常快的(几乎可以忽略它的耗时),因此从程序优化角度来考虑,使用位运算符来代替一些耗时操作(如/,%等)是十分必要的。
练习3:在不使用%的情况下,怎样计算num%8的值?(num为整数)
答案:num &= 7即可

15、逗号运算符
符号及含义:,(分隔作用)
数目:未知
结合性:自左至右
优先级:15级(最低)
使用方法:表达式,表达式……
逗号运算符是运算符里优先级最低的运算符,仅仅起到分隔的作用。

相关文档