数据和操作
1.进制与进制转换
2.源码补码反码
3.整型变量的定义和使用
4.浮点型变量的定义和使用
5.字符型变量的使用
6.运算符和表达式简介
7.算术运算符
8.自增自减运算符
9.关系运算符
10.逻辑运算符
11.条件运算符
12.复合算术赋值运算符
14.逗号运算符
15.运算符的优先级和结合性
计算机的作用?
计算机就是实现存储数据,处理数据并返回结果。
一、认识进制
1.十进制:逢十进一、0-9
9+ 1
10
2.二进制:逢二进一、0,1
1
- 1
10
3.八进制:逢八进一、0-7 047
7
- 1
10
4.十六进制:逢十六进一、0-9 A(10),B(11),C(12),D(13),E(14),F(15)
f
-
1
10
5.二进制和十进制相互转换
十进制转成二进制:除二取余法
减幂取值法:找比该数小且最近的幂值进行相减,可减为1,不可减为0;
二进制转成十进制:
1011011
权位 i = 3,2,1,0
0b 1 0 0 1
权位:3210 权2^i 二进制转换成十进制每一位上的数字*该位的权。
1*2^0+1*2^1+1*2^2+0*2^3+1*2^4+1*2^5+0*2^6+1*2^7
6.二进制和八进制相互转换
二进制转成八进制:每三位一组,取1对应的幂值相加
八进制转成二进制:将一位八进制数分解为三位二进制数
7.二进制和十六进制相互转换
二进制转成十六进制:第四位一组,取1对应的幂值相加
十六进制转成二进制:将一位十六进制数分解为四位二进制数
8、八进制转换十进制
每一位上的数字*该位的权(8^i)
012—>10
9、十六进制转换成十进制
每一位的数字*该位的权 (16^i)
0xA2—>162
练习
将下列数转换成十进制的数
0xF9 016 0b1001-
249 14 9
【十进制 转换成 二进制、八进制、十六进制】
1、十进制转成二进制 — 除二取余
10 —》0b1010
19—>0b10011
37—》0b100101
52—》0b110100
61—》 0b111101
2、十进制转换成八进制 —除八取余
57—》071
111—》0157
88——》 0130
3、十进制转换成十六进制 —除十六取余
46——》0x2E
53——》0x35
【课堂练习】
将下列十进制的数转换成二进制、八进制、十六进制
66 0b1000010 0102 0x42
200 0b11001000 0310 0xC8
【二进制、八进制、十六进制之间的快速转换】
8421
【二进制—》八进制】三位为一位
【二进制—》十六进制】四位为一位
0b11100101011—》011 100 101 011—》03453
—》0111 0010 1011—》0X72B
【八进制—》二进制】一位变三位
【十六进制—》二进制】一位变四位
065—》0b110101
0xFFAC5—>0b1111 1111 1010 1100 0101
二、原码、反码、补码
存储数据:先确定字节数,再存储数据。
Byte(B):字节,是计算机中最小的存储单位。
bit(b):位,一个二进制数是一位,是计算机最小的处理单位。
1B=8b =a=4=!
1KB ==1024B
1MB==1024KB==1024^2B
1GB==1024MB==10242KB==10243B
1TB==1024GB==10242MB==10243KB==1024^4B
原码:先确定字节数,再确定符号位(0表示正数,1表示负数),其它位表示数值大小。
64与-64
1B 0100 0000 64的原码
1B 1100 0000 -64的原码
思考:分别存储1和-1的原码,思考计算机是否可以用原码的形式存储数据?
1B 0000 0001 1的原码
1B 1000 0001 -1的原码
1000 0010 -2
结论:计算机不能用原码的形式存储,会影响计算结果
反码:正数的反码就是它的原码,负数的反码,符号位不变,其它位按位取反(1变0,0变1)
思考:分别存储1和-1的反码,思考计算机是否可以用反码的形式存储数据?
1B 0000 0001 1的原码、反码
1000 0001 -1的原码
1111 1110 -1的反码
1111 1111
结论:计算机不能用反码的形式存储,会影响计算结果
补码:正数的补码、反码、原码一致。负数的补码是其反码加1
思考:分别存储1和-1的补码,思考计算机是否可以用补码的形式存储数据?
1B 0000 0001 1的原码、反码、补码
1000 0001 -1的原码
1111 1110 -1的反码
1111 1111 -1的补码
1 0000 0000 0
结论:计算机是以补码的形式来存储数据。
三、数据类型、常量、变量(标识符)
基本类型 int(整型)/short int(短整型)/long int(长整型) float(单精度浮点型)/double(双精度浮点型) char(字符型) 枚举
数据类型:
1.复杂(合)数据类型 2. 数组 3.结构体 4.共用体 5.指针 6.void
常量:程序运行过程中,其值不会发生变化的量。
**整型常量 : ** 4
浮点型(实型)常量:2.3
字符常量: ‘3’ ‘\0324’ ‘\0x32’ ‘\n’ :用单引号括起来的一个字符。
字符串常量: “中国” “” :用双引号括起来的若干字符。
变量:就是在内存中开辟一定字节的空间,这个空间的名称叫变量名,空间中的内容可以随时发生变化,叫变量。
整型变量:
16b 32b 64b
short 2B 2B 2B
int 2B 4B 4B
long 4B 4B 8B
浮点型变量:
float: 4 6-7
double: 8 13-16
浮点型变量
单精度 float 4字节 %f 6-7位
双精度 double 8字节 %lf 15-16位
字符型变量:
/char 1B 本质 上就是整型/
【扩展—了解】
规范化科学计数法
小数部分:小数点前面有且只用一位非0的数字;
指数部分:都是整数。
23.567 ——》2.3567*10^1—>2.3567E1
标识(志)符:可以标识变量、数组、函数、结构体、共用体、枚举等的有效字符序列。
标识符全名规则:
1.不以数字开头
2.只能包含:字母、数字、下划线
3.不能是关键字(保留字)
//关键字(保留字):C语言保留了一些字符用作特殊的用途,这些字符就是保留字。
4.望文知意
// int a = 5;
//声明变量格式:数据类型 变量名;
//开辟了一个4字节的空间,空间的名称是a,空间中存储的数据是5
//=:赋值号,将右边的值存入左边的变量中。
// int b,c,d,e;
//给变量赋值:1.赋初值(初始化):在定义变量的同时就赋值。2.赋值:先定义变量,后赋值
// b=c=d=e=8;
// char ch =67;
sizeof 计算数据类型的大小
// printf("int:%ld\n",sizeof(int)); 4字节
// printf("short:%ld\n",sizeof(short)); 2字节
// printf("long:%ld\n",sizeof(long)); 8字节
// printf("float:%ld\n",sizeof(float)); 4字节
// printf("double:%ld\n",sizeof(double)); 8字节
// printf("char:%ld\n",sizeof(char)); 1字节
// printf("%d\t%c",'\n','\n');
// double f = 1.23456789123456789123;
// printf("%.18lf\n",f);
// unsigned int o=-1;
// printf("%u\n",o);
// int a =4;
// float b = 3.4;
// char c = 'c';
// printf("int:%d\nfloat:%f\nchar:%c\nstring:%s\n",a,b,c,"how are you");//输出 int:4 float:3.400000 char:c string:how are you
// putchar(c);
// int a;
// printf("请输入一个整数:");
//// scanf("%d",&a);
// printf("%d\n",a);
// char c;
// printf("请输入一个字符:");
// c=getchar();
//
// putchar(c);
// putchar('\n');
// return 0;
// 1.输入一个整数,输出一个整数。再输入一个整数,再输出这个整数。
// int a ;
// printf("请输入一个整数:");
// scanf("%d",&a);
// printf("a1:%d\n",a);
// printf("请再输入一个整数:");
// scanf("%d",&a);
// printf("a2:%d\n",a);
// 2.输入一个字符,输出一个字符,再输入一个字符,再输出这个字符。
char ch;
printf("请输入一个字符:");
scanf("%c",&ch);
//4\n
printf("%c\n",ch);
printf("请再输入一个字符:");
getchar();
scanf("%c",&ch);
printf("%c\n",ch);
四、输入与输出
【输入与输出】
1、什么是输入输出?
【输入】从外部输入数据到内存中。
【输出】将内存中的数据显示到显示器上。
2、如何进行输入输出?
进行输入与输出,需要通过格式化输入与输出函数;
【格式化输入】
scanf(“格式说明符”,地址列表);
// scanf("格式说明符 % ",地址列表)
//【注】格式说明符最后不可以添加\n
//【注】格式说明符可以多个,也就是说可以一次性为多个变量赋值,在使用键盘输入的时候,每一个数值之间用空格、换行、tab隔开进行输入。
//【注】格式说明符之间可以加入其他的字符,但是在输入的时候需要在对应的位置输入相同的字符
%i和%d都是表示有符号十进制整数,但%i可以自动将输入的八进制(或者十六进制)转换为十进制,而%d则不会进行转换。
【格式化输出】
printf(“*****************”);
//“”之间的字符串原样输出
printf(“格式说明符+普通字符”,输出列表);
//格式说明符+普通字符—》普通字符是原样输出,格式说明符是输出项的值是多少就输出多少。
printf(“格式控制符“,输出列表); //输出函数
格式控制符:
%d :十进制整数
%o:八进制整数
%x:十六进制整数
%f:浮点数
%c:字符
%s:字符串
%p:地址
针对64位系统来说的
1.短整型 short 2字节 %hd
2.基本整型 int 4字节 %d
3. 长整型 long 8字节 %ld
4. 无符号的短整型 unsigned short 2字节 %hu
5. 无符号的基本整型 unsigned int 4字节 %u
6. 无符号的长整型 unsigned long 8字节 %lu
第一个参数中,除格式控制符外,其它的字符叫做普通字符,原样输出。
putchar():只能输出一个字符
puts():只能输出字符串。
scanf(“格式控制符”,输入列表); //输入函数
getchar();只能输入一个字符
gets();只能输入字符串
##【注】输入列表,必须有&:取地址符);
##[注]:第一个参数中,除了格式控制符外,什么都不要添加。
输入与输出的缓冲区:字节流,流入一个叫做蓄水池(缓冲区)。当缓冲区中没有数据时,scanf会处于阻塞状态,在阻塞状态时,会等待用户输入。如果缓冲区中有数据时,scanf不会处于阻塞状态,也不会等待用户输入,而是直接从缓冲区中读取数据。
表达式:由变量、常量和运算符组合起来的式子。单独的一个常量或一个变量,也是表达式。
如何阅读表达式?
1.看表达式的功能
2.看表达式的值
五、算术运算符与算术表达式
- :乘 3*7
/ : 除 0/3 5/3
【注】:除号两边如果都是整型,结果为整型。如果有一边为浮点型,结果浮点型。
%:模(取余) 5%3 8%2 2%8 2%5
【注】:模两边必须为整型
- :加 1+1
- :减
六、自增、自减运算符
++:自增
- :自减
功能:i++:加前取值 (先取i的值参与运算,然后i的值加1) ++i:加后取值(先将i的值加1,然后再参加运算)
值:无论是加前取值,还是加后取值,变量i都加1
- :自减
七、关系运算符与关系表达式
功能:比较大小
值:成立(1),不成立(0)
:大于 4>3
=:大于或等于 4>=4 4>=3
<: 小于
<=:小于或等于
==:等于
!=:不等于
八、逻辑运算符与逻辑表达式
!:非
【注】:只有0为假,其它一切非0的数据皆为真。
逻辑:非真即假,非假即真
&&:与
逻辑:只要有一边为假,结果为假,两边都为真,结果才为真。
||:或
逻辑:只要有一边为真,结果为真,两边都为假,结果才为假。
九、认识表达式
由常量、变量、运算符组成的式子就是表达式;
【如何掌握一个表达式?】
两大法宝:1、表达式的功能; 2、表达式的值
1)赋值运算符与表达式
赋值运算符 =
赋值表达式 a = 2; b=10;c = ‘a’;
【功能】给变量赋值;
【值】赋值之后变量的值;
【注】赋值运算符的左边必须是一个变量
2)算术运算符与表达式
运算符 + - * /(如果两边都是整型,结果还是整型。3/2 = 1而不是1.5)
%(要求%符号两边都必须是整型)
表达式 a+3 b*d d/4
【功能】完成算术运算
【值】表达式的值是算术运算的结果。
【注】1、同一类型的变量进行算术运算,结果还是该类型。
2、不同的类型的变量进行算术运算,先转换成同一类型,在进行运算。
【自动转换的规则】
1、整型向浮点型转换;
2、短字节向长字节转换;
3、有符号向无符号转换。
3)强制类型转换运算符与表达式
运算符:(目的类型)
表达式 (int)3.14 (short)5
【功能】将类型强制转换
【值】转换完成之后的值。
【注】类型转换并不会改变原有的变量的值,只是表达式的值变成转换之后的值。 例如 float a = 3.14; (int)a;a还是3.14,但是(int)a表达式的值变成了3.
4)复合算数运算符与表达式
运算符 += -= *= /= %=
表达式 a+=2; —>a=a+2 b%=5;—>b=b%5;
【功能】先进行算数运算,然后赋值;
【值】赋值之后的值。
5)自增与自减运算符与表达式
运算符 ++ —
表达式 a++ ++a b— —b
【功能】是变量的值减1或加1;
【值】a++;后加加,表达式的值是a加1之前的值;(先赋值后加加)
++a;先加加,表达式的值是a加1之后的值;(先加加后赋值)
【注】不可以对常量进行自增或者自减运算。
6)关系运算符
运算符:> >= < <= == !=
表达式 a>b a>=9 a==b
【功能】进行大小关系的比较;
【值】 关系成立,值为1;否则,值为0;
7)逻辑运算符与表达式
运算符:&&(与、且) || (或) !(非)
表达式 a&&b a||b !a
【功能】进行逻辑运算
【值】
【注】a&&b&&c a||b||c连与连或时需要注意:
a&&b&&c当表达式a为真时,需要计算表达式b的值,当表达式a、b的值为真时,才需要计算表达式c的值。
a||b||c当表达式a的值为假时,才需要计算表达式b的值,当表达式a、b的值为假的时候,才需要计算表达式c的值。
// int a,b=2,c=8,d=1;
// a= ((b=3)&&(c=9)&&(d=8));
// printf("a=%d\nb=%d\nc=%d\nd=%d\n",a,b,c,d);
输出结果a =1 b=3 c=9 d=8
int a,b=2,c=8,d=1;
a=((b=3)&&(c=9)||(d=8));
printf("a=%d\nb=%d\nc=%d\nd=%d\n",a,b,c,d);
输出结果 a=1 b=3 c=9 d=1
int a,b=2,c=8,d=1;
a=((b=3)||(c=9)&&(d=8));
printf("a=%d\nb=%d\nc=%d\nd=%d\n",a,b,c,d);
输出结果 a=1 b=3 c=8 d=1
int a,b=2,c=8,d=1;
a=((b=3)||(c=9)||(d=8));
printf("a=%d\nb=%d\nc=%d\nd=%d\n",a,b,c,d);
输出结果 : a =1 b=3 c=8 d=1
练习:
1》判断下列表达式哪个为true哪个为false。
a:(100>3)&&(‘a’>’c’) false
b:(100>3)||(‘a’>’c’) ture
c:!(100<3) ture
2》构造一个表达式来表示下列条件:
a:number等于或大于90,但小于100 number>=90&&number<100
b:ch不是字符q也不是字符k ch!=‘q’&&ch!=‘k’ 或者 !(ch==‘q’||ch=‘k’)
c:number界于1到9之间(包括1不包括9),但是不等于5
number>=1&&number<9&&number<=5
d:number不在1到9之间 number<1||number>9或者!(number>=1&&number<=9)
3》判断这个字符是空格,是数字,是字母
ch=‘ ’||ch>=‘0’&&ch<=‘9’||ch>=‘A’&&ch<=‘Z’||ch>=‘a’&&ch<=‘z’;
4》有3个整数a,b,c,判断谁最大,列出所有可能
a>b>c;
a>c>b;
b>a>c;
b>c>a;
5》判断year表示的某一年是否为闰年,用逻辑表达式表示。
闰年的条件是符合下面二者之一:
a:能被4整除但不能被100整除
b:能被400整除
(year%4==0)&&(year%100!=0)||year%400==0;
九、条件运算符(三目运算符、三元运算符)
?:
格式 :表达式1?表达式2:表达式3
逻辑:计算表达式1的值:值为1:执行表达式2,值为0:执行表达式3
练习:
1》求一个三位数的和
方法一:
b=number/100
s=number%100/10 或者 s=number/10%10
g=number%10
2》判断一个年份是闰年还是平年
printf(“%s\n”,(year%4==0&&year%100)||year%400==0?“闰年”:平年);
3》判断一个数是偶数还是奇数
printf(“%s\n”,number%2? “奇数”: “偶数”);
printf(“%s\n”,number%2==0? “偶数”:“奇数”);
4》判断一个数是正数还是负数
printf(“ %s\n”,number==0? “非正非负!”:number>0? “正数”:“负数”);
printf(“%s\n”,nunber?number>0? “正数”:“负数”:“非正非负”);
十、赋值运算符
1 简单赋值 =
赋值号左边只能是变量,赋值号右边可以是常量、变量、表达式。
a=1+1; a=2;a=b;
2复合运算赋值
+=
=
-=
/=
%=
功能: 将运算符左边变量中的值与运算符右边表达式的值进行相应的算术运算。
值: 将运算后的值再次赋值给运算符左边的变量。
int a=3;
a*=2+2;<==> a=a*(2+2)
练习:
写出下面复合表达式运算后a的值,设原来a=12
1》a+=a; a=a+a;==>a=24;
2》a-=2; a=a-2==>a=10;
3》a*=2+3; a=a*(2+3)==>a=60;
4》a/=a+a; a=a/(a+a)==>a=0
十一、逗号运算符
十二、优先级
! ++ —
* / %
+ -
> ,< , >=,<=
== !=
&&
||
? :
= += -= *= /= % =
!——算术运算符(++ 、- -、 *,/,%,+,-)
运算符与表达式
// printf("%lf",(double)(5/3));
// int i= 5;
// int a = i++;
// i++;
// ++i;
// printf("%d\n%d",a,i); 5 和 8
// printf("%d\n",!"你");
// int a,b,c,d;
**// a= ((b=3)||(c=9)||(d=8));
##// printf("a=%d\nb=%d\nc=%d\nd=%d\n",a,b,c,d); 输出 1 3 0 0 因为 c 和 d 没有进行运算
// 根据成绩判断是否可以学习OC
int score;
printf("请输入一个成绩:");
scanf("%d",&score);
score>=90?printf("可以学习OC\n"):printf("拜拜\n");
printf("%s\n",score>=90?"可以学习OC":"拜拜");
return 0;
【输入与输出的过程】
【字符变量的输入与输出】
【注】字符变量使用scanf输入值只能使用%c的格式说明符,%c格式说明符是一个“男女老少通吃”的格式说明符。
【见代码 day3—输入与输出的过程】
#include <stdio.h>
#include <stdlib.h>//标准静态库 里面含有的大量的经常使用的方法
int main(int argc, const char * argv[]) {
// int a;
// scanf("%d",&a);
// //键盘输入 2\n---》缓冲池 2 \n-->scanf会将缓冲池中的2读取到变量a-->缓冲池中剩余\n
//
// printf("a = %d\n",a);
// //空格、换行、tab都属于空白字符。第二次输入缓冲池中的数据会直接将缓冲池中的空白字符给覆盖掉
// //键盘输入 3\n--->缓冲池 3 \n-->scanf会将3读取走到a-->缓冲池剩下\n
// scanf("%d",&a);
// printf("a = %d\n",a);
// char c;
// scanf("%c",&c);
// //键盘输入 q\n-->缓冲池中 q\n-->scanf(%c)-->c = 'q';-->缓冲池中\n
// printf("c=%c\n",c);
//
// //清理缓冲池中的数据叫做冲刷缓冲池
// //冲刷缓冲池 stdin标准输入流 stdout 标准输出流
// fpurge(stdin);
//
// scanf("%c",&c);
// //scanf("%c")-->c='\n'
// printf("c=%c****\n",c);
//
// fpurge(stdin);
//
// scanf("%c",&c);
// //scanf("%c")-->c='\n'
// printf("c=%c****\n",c);
//
// //q \n
//有关字符变量的输入与输出:1、标准输入与输出 printf scanf 2、getchar putchar;
// char a;
// //getchar从键盘获取一个字符存储到变量a中
// a = getchar();
// //putchar 输出变量的值 无法换行
// putchar(a);
// printf("a=%c\n",a);
//【扩展】scanf方法的返回值是int,这个返回值的意义?
//【答】scanf能够成功赋值的变量的个数
//【注】scanf去缓冲池中查找复合要求的数据时,只会按顺序查找,并且只能跳过空白字符,当第一个非空白字符时,停止查找,如果该字符复合要求读取成功,如果不服好要求读取失败
int a;
float f;
//将函数scanf方法的返回值赋值给变量k;
int k = scanf("%d%f",&a,&f);
printf("a=%d f=%.2f k=%d\n",a,f,k);
return 0;
}
//有关字符变量的输入与输出:1、标准输入与输出 printf scanf 2、getchar putchar;
char a;
//getchar从键盘获取一个字符存储到变量a中
a = getchar();
//putchar 输出变量的值 无法换行
putchar(a);
printf("a=%c\n",a);
【扩展】
//【扩展】scanf方法的返回值是int,这个返回值的意义?
//【答】scanf能够成功赋值的变量的个数
//【注】scanf去缓冲池中查找复合要求的数据时,只会按顺序查找,并且只能跳过空白字符,当第一个非空白字符时,停止查找,如果该字符复合要求读取成功,如果不服好要求读取失败
int a;
float f;
//将函数scanf方法的返回值赋值给变量k;
int k = scanf("%d%f",&a,&f);
printf("a=%d f=%.2f k=%d\n",a,f,k);