嵌入式 c语言基础3

第二部分:类型转换
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
注意:该练习仅适用于旧版编译器。由于新版本编译器的优化功能,程序仍然会输出no。在这里只需了解原理即可

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;
}
4
练习2:在练习1基础上,将变量类型改成float类型,查看输出结果
int main()
{
float a = 22;
float b = 5;
printf("%f\n",a/b);
return 0;
}
4.4
练习3:读以下程序,猜想输出的结果,再执行程序检验自己的猜想
#include <stdio.h>
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;
}
67.5
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;              (a>2 && 4>a)
if( 4>a>2)                                4>3是真,返回值为1, 而1>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;
}
ture false ture
/*************练习题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:读以下程序,猜想输出的结果,再执行程序检验自己的猜想
#include <stdio.h>
int main()
{
int i = 8,j = 10,k = 12;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值