C语言基础
C语言基础入门笔记
推荐书籍
- 操作系统:操作系统之哲学原理;
- 计算机网络:谢希仁版计算机网络;
- 微机原理:清华大学出版的微机原理;
- 数据结构:;
类型
首先要知道C、C++、Java等语言是强类型语言,它们有两个特点:
- 先定义才能使用(先确定类型再说程序);
- 类型不可转变(强制转换和隐式转换都只是转换值,而不是类型);
需要记牢的知识:
sizeof():计算某种类型所占的字节个数。(1byte=8bit)
sizeof(char):1(相当于1 byte int;mini int )
sizeof(short):2
sizeof(int):4
sizeof(long int):4
sizeof(long long):8
sizeof(float):4
sizeof(double):8
sizeof(long double):8(在c11中为12)
sizeof(bool):1(1 byte;非0即真)
源反补码
首先先了解十进制、二进制、八进制和十六进制;
例如:
(119)10==》(0111 0111)2==》(167)8==》(77)16
从上面这个例子可以归纳出:3个二进制为1个八进制,4个二进制为1个十六进制。
源码:2进制的编码;
反码:对源码取反;
补码:在反码的基础上加1;
例如:
a = 5 // 0000 0101 =》5 源码
b=-5 // 1000 0101 =》-5 源码
// 1111 1010 反码
// 1111 1011 补码
正数的补码是源码本身。
在计算机中,数据的存储是以补码的形式存放的。(方便相加,CPU只做加法运算)
存放数据的形式:高位存放在高地址中,低位存放在低地址中,这种形式使用在PC中(小端存储);
而在安卓等移动端中使用的是大端存储,即高位存放在低地址中,低位存放在高地址中。
注意:负数的最高位是符号位,但也是进位;正数的只是进位。
当范围小的用范围大的表示时需要扩充,扩充的是符号位。(扩充只看符号位,符号位是0则用0扩充,符号位是1则用1扩充)
例如:
char c = 128;
unsigned char uc = 128;
unsigned short us = 0;
us = c+uc;
printf("%x \n",us);
us = ( unsigned )c+uc;
printf("%x \n",us);
us = c+(char)uc;
printf("%x \n",us);
输出:
0
100
ff00
输出分析:
因为sizeof(char)为1,而sizeof(short)为2。(有无字符型占的字节都一样)
所以当字节小的赋值给字节大的时候需要扩充,且扩充的是符号位。
则:
char c: 1111 1111 1000 0000
unsigned char c: 0000 0000 1000 0000
unsigned char uc: 0000 0000 1000 0000
char uc: 1111 1111 1000 0000
第一个unsigned short us: 0000 0000 0000 0000(进位的1因为超出字节范围而舍弃)
第二个unsigned short us: 0000 0001 0000 0000
第三个unsigned short us: 1111 1111 0000 0000(进位的1因为超出字节范围而舍弃)
则:
第一个us输出为0;
第二个us输出为0100;(高位0被舍弃)
第三个us输出为ff00;(因为输出按16进制)
练习
题目一:输入三个数进行从小到大的输出
int main()
{
int a,b,c;
int temp;
scanf_s("%d %d %d",&a,&b,&c);
if (a>b)
{
temp = a;
a = b;
b = temp;
}
if (b>c)
{
temp = b;
b = c;
c = temp;
}
if (a > b)
{
temp = a;
a = b;
b = temp;
}
printf("%d %d %d",a,b,c);
return 0;
}
题目二:输入一个数判断是否与随机数相等
int main()
{
int a = 100;
srand(time(NULL));
int b = rand() % a;
int c;
printf("猜猜随机数是多少,范围在0-99之间 \n");
scanf_s("%d",&c);
while(c<0||c>99)
{
printf("输入超出范围,请重新输入: \n");
scanf_s("%d",&c);
}
while (c!=b)
{
if (c>b)
{
printf("输入的数大了,请重新输入 \n");
scanf_s("%d", &c);
}
else
{
printf("输入的数小了,请重新输入 \n");
scanf_s("%d", &c);;
}
}
printf("输入正确");
return 0;
}
题目三:输入年份和月份,输出这一年这一月有多少天
int main()
{
int year, month;
int day;
printf("请输入年份和月份:按年-月格式输入 \n");
scanf_s("%d-%d",&year,&month);
while(month<1||month>12)
{
printf("输入错误,请重新输入 \n");
scanf_s("%d-%d", &year, &month);
}
if (month==1||month==3|| month == 5|| month == 7|| month == 8|| month == 10|| month == 12)
{
day = 31;
}
else if (month == 4|| month == 6|| month == 9|| month == 11)
{
day = 30;
}
if (month == 2)
{
if ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0))
{
printf("这一年是闰年 \n");
day = 29;
}
else
{
printf("这一年不是闰年 \n");
day = 28;
}
}
printf("这个月有%d天",day);
return 0;
}
题目四:输入年月日,输出这天是这一年的第几天
int main()
{
int year, month, day;
printf("请输入年月日:按年-月-日格式输入 \n");
scanf_s("%d-%d-%d",&year,&month,&day);
//判断输入是否正确
while(month<1||month>12)
{
printf("输入错误,请重新输入 \n");
scanf_s("%d-%d-%d", &year, &month, &day);
}
if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
{
while (day<1||day>31)
{
printf("输入错误,请重新输入 \n");
scanf_s("%d-%d-%d", &year, &month, &day);
}
}
else if (month == 4 || month == 6 || month == 9 || month == 11)
{
while (day<1||day>30)
{
printf("输入错误,请重新输入 \n");
scanf_s("%d-%d-%d", &year, &month, &day);
}
}
if (month == 2)
{
if ((year % 4 == 0) && (year % 100 != 0)||(year % 400 == 0))
{
while (day<1||day>29)
{
printf("输入错误,请重新输入 \n");
scanf_s("%d-%d-%d", &year, &month, &day);
}
}
else
{
while (day < 1 || day>28)
{
printf("输入错误,请重新输入 \n");
scanf_s("%d-%d-%d", &year, &month, &day);
}
}
}
//计算输入是这一年的第几天
int sum = day;
for (int i = 0; i < month; i++)
{
if (i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 || i == 12)
{
sum = sum + 31;
}
if (i == 4 || i == 6 || i == 9 || i == 11)
{
sum = sum + 30;
}
if(i == 2)
{
if ((year % 4 == 0) && (year % 100 != 0)||(year % 400 == 0))
{
printf("这一年是闰年 \n");
sum = sum + 29;
}
else
{
printf("这一年不是闰年 \n");
sum = sum + 28;
}
}
}
printf("这一天是这一年的第%d天",sum);
return 0;
}
在做这几个小练习的时候,我发现在写一个程序之前一定要先思考怎么去做,类型用哪些,输入的判断以及范围的判断等都是在编写程序前应该思考好,然后再去写,还有就是变量的名字一定不要用拼音来代替以及千万不要用关键字来作为变量名。