C语言基础.docx
- 文档编号:30650219
- 上传时间:2023-08-18
- 格式:DOCX
- 页数:62
- 大小:166.47KB
C语言基础.docx
《C语言基础.docx》由会员分享,可在线阅读,更多相关《C语言基础.docx(62页珍藏版)》请在冰豆网上搜索。
C语言基础
第1章C语言概述
1.1计算机科学史
古希腊:
希望发明某种工具代替优秀的人脑。
制造工具的前提是必须有明确的需求。
=》科学在逻辑的基础上得到了发展。
逻辑:
研究思维的科学,也称为计算。
逻辑的例子:
凡是人皆会死,苏格拉底是人,所以苏格拉底会死。
苏格拉底说:
我没有知识,但我可以和别人讨论知识。
先驱之一:
法国的帕斯卡(1623-1662):
19岁时,为父亲发明了机械计算机(加法器)。
“人只不过是一根芦苇,是自然界最脆弱的东西,但他是一根有思想的芦苇。
”
先驱之一:
德国科学家契卡德,1623年,为开普勒制造了能进行乘除运算的计算机。
早期计算机的极限:
表达思维的逻辑系统比传送能量的机械系统复杂的多。
上世纪初:
电子管、晶体管、集成电路的发展为表达逻辑系统创造了条件。
结论:
逻辑思维是计算机科学的核心。
目标:
从业者的应比其他人更善于表达、交流思想。
对象
操作者
客观世界
信息
人
电脑世界
数据
程序(人的智力)
1.2程序语言的历史
机器语言→汇编语言→高级语言。
ALOGOL60(60年OOP)
不适合开发系统软件
CPL(CombineProgramLanguage,63年)
难以实现。
什么都能干,什么也干不好。
BCPL(基本CPL,67年)
无特别建树
B(70年)
很简单,很接近硬件,数据无类型
贝尔实验室用之开发了UNIXV5
C(72年)
DennisM.Ritchie
高级语言。
却能直接对内存、寄存器操作。
KenThompson
DennisM.Ritchie
用C改写了UNIX的90%的代码。
(73年)
BrianW.Kernighan
DennisM.Ritchie
《CProgrammingLanguage》
(87年)(2004年中译本)
C89标准
美国国家标准化协会ANSI
C99标准
C语言:
专业学生入门的必由之路。
1.3C语言的学习方法及示例
1.3.1C语言的学习方法
概念多,组合方式更多。
多看书,多记忆=》一塌糊涂!
多读程序,多写程序,
纸笔调试程序,上机调试程序;
读一页纸程序,写1-2页纸草稿。
1.3.2C语言程序示例
例1:
打印HelloWorld!
#include
intmain()
{
printf("HelloWorld!
\n");
return0;
}
例2:
两数相加
#include
intmain()
{inta,b,c;
a=11;b=22;
c=a+b;
printf("c=%d\n",c);
return0;
}
例3:
函数调用
#include
intmax(intx,inty);
intmain()
{inta,b,c;
scanf("%d,%d",&a,&b);
c=max(a,b);
printf("max=%d\n",c);
return0;
}
intmax(intx,inty)
{intz;
if(x>y)z=x;
elsez=y;
return(z);
}
第2章数据类型、运算符与表达式
2.1数据类型概述
数据类型:
数据在内存中的存储方式、运算方法。
数据类型
符号
字节数
数值范围
整型
int
4
-231~231-1
单精度实型
float
4
1038……1038(6位有效数字)
双精度实型
double
8
-10308……10308(17位有效数字)
字符型
char
1
-128~127
整型数据的内存个数:
字符
短整数
长整数
2.2常量与变量
2.2.1常量
整型常量
10进制数:
0,2,637,32767,32768
8进制数:
072,0777,0100
16进制常数:
0x10001,0xABC,0xffff
实型常量
0.0,1.0,2.68,3.141593
0.0E0,6.226e4,6.226E4
字符常量
'a','A','1','','+',
'\n'(换行),'\r'(回车),
'\t'(横向跳格),'\''(单引号)
字符串常量
"VisualC++","12.34",
"Thisisastring.\n"
2.2.2符号常量
常数:
整数常数、实型常数、字符常数、字符串常数。
直接使用常量
使用符号常量
voidmain()
{floatarea;
area=10*10*3.14;
printf("area=%f\n",area);
}
#definePI3.1416
#defineR10
voidmain()
{floatarea;
area=R*R*PI;
printf("area=%f\n",area);
}
好习惯:
符号常量用大写字符组成。
符号常量的意义:
增强可读性。
技术细节:
编译前,对符号常数进行原样替换。
#defineR10
#defineR10;
2.2.3变量
变量定义语句
类型定义符变量名,变量名,……,变量名;
intmain()
{
charc;//将c定义为char型的变量
inti,j;//将i定义为int型的变量
floatx,y;//将x定义为float型的变量
doublez;//将z定义为double型的变量
printf("charsize=%d\n",sizeof(c));
printf("intsize=%d\n",sizeof(i));
printf("floatsize=%d\n",sizeof(x));
printf("doublesize=%d\n",sizeof(z));
return0;
}
变量名:
字母、下划线开头的,由字母、下划线、数字组成的字符串,长度小于32。
良好的命名习惯:
望文生义。
例:
循环变量:
i,j,k;计数:
count;求和:
total
变量名:
内存单元的标识。
①表示内存单元中的值
②表示内存单元的空间
3.3整型数据
3.3.1整数变量的类型
类型定义符:
int
类型修饰符:
short(缺省),long;
signed(缺省),unsigned
整型
空间大小
取值范围
int
shortint
signedint
2字节
-32k~32k-1
unsignedint
unsignedshortint
2字节
0~64k-1
longint
long
4字节
-2g~2g-1
Unsignedlongint
4字节
0~4g-1
测试程序:
voidmain()
{printf("sizeof(int)=%d\n",sizeof(int));
printf("sizeof(shortint)=%d\n",sizeof(shortint));
printf("sizeof(signedint)=%d\n",sizeof(signedint));
printf("sizeof(unsignedint)=%d\n",sizeof(unsignedint));
printf("sizeof(unsignedshortint=%d\n",sizeof(unsignedshortint));
printf("sizeof(longint)=%d\n",sizeof(longint));
printf("sizeof(long)=%d\n",sizeof(long));
printf("sizeof(unsignedlongint)=%d\n",sizeof(unsignedlongint));
}
存储方式:
补码。
3.3.2补码
1、原码
最高位作为符号位:
0表示正数,1表示负数。
其余位:
表示数的绝对值。
例:
00101011=+43,10101011=-43
取值范围:
8位:
-127~127(-27+1~28-1)
问题:
有+0(00000000)和-0(100000000)之分;
减法运算较繁。
原码减法运算的问题
43+(-23)=20(00010100)
00101011(43)
+10010111(-23)
11000010(-66)
2、补码
负数:
符号位是1,其余部分是原码的每一位取反后,再加1。
-43原=10101011
-1原=10000001
-127原=11111111
-43补=11010101
-1补=11111111
-127补=10000001
补码的一个性质:
[[X]补码]补码=[X]原码
字节代码
无符号整数
原码
补码
00000000
0
0
0
00000001
1
1
1
……
……
……
……
01111111
127
127
127
10000000
128
-0
-128
10000001
129
-1
-127
……
……
……
……
11111111
255
-127
-1
-128原=?
-128补=?
补码的计算规则:
补码的算例
43+(-23)=20(00010100)
00101011(43)
+11101001(-23)
00010100(20)
结论:
补码规则是完善的。
[X]补+[Y]补=[X+Y]补
[X]补+[-Y]补=[X-Y]补
3、补码运算要点
负数->补码
最高位设为1;
表示绝对值的各位取反,加1。
补码->负数
最高位为1即是负数;
减1,其余位取反,得绝对值。
3.3.3不同类型的整数变量相互赋值
1、将unsigned整数赋值给signed变量
小正数还是小正数,大正数变成负数。
voidmain()
{unsignedinta;
intb;
a=32768;
b=a;
}
内存情形:
a为32768
(1000,0000,0000,0000)
b为-32768
(1000,0000,0000,0000)
2、将signed整数赋值给unsigned变量
正数还是正数,负数变成大正数。
voidmain()
{inta;
unsignedintb;
a=-2;
b=a;
}
内存情形:
a为-2
(1111,1111,1111,1110)
b为65534
(1111,1111,1111,1110)
3、将short整数赋值给long变量
由于符号位自动扩展,所以正数还是正数,负数还是负数。
voidmain()
{inta;
longintb;
a=2;
b=a;
}
内存情形:
a为2
(0000,0000,0000,0010)
b为2
(0000,0000,0000,0000,0000,0000,0000,0010)
voidmain()
{inta;
longintb;
a=-2;
b=a;
}
内存情形:
a为-2
(1111,1111,1111,1110)
b为-2
(1111,1111,1111,1111,1111,1111,1111,1110)
4、将long整数赋值给short变量
丢失两个字节,结果可能是正数,也可能是负数。
voidmain()
{longinta;
intb;
a=65535;
b=a;
}
内存情形:
a为65535
(0000,0000,0000,0000,1111,1111,1111,1111)
a为-1
(1111,1111,1111,1111)
3.3.4枚举类型
起因:
#defineA0
#defineB1
#defineC2
#defineNOPASS3
定义类型
enumgrade{A,B,C,NOPASS};
细节一:
避免枚举符号和其他变量重名。
细节二:
enumgrade{A,B=5,C,NOPASS}
相当于
A=0,B=5,C=6,NOPASS=7
变量的使用方法:
定义变量
enumgradegrade1;
变量赋值
grade1=A;
grade1=NOPASS;
意义:
增强程序的可读性。
3.4浮点型数据
3.4.1内存形象
123.456123.1.23e3
类型定义符:
floatdouble
类型修饰符:
long
float
4字节
精度7位有效数字
double
8字节
精度15位有效数字
longfloat
8字节
精度15位有效数字
longdouble
10字节
精度18位有效数字
程序:
验证字节数
voidmain()
{printf("sizeof(float)=%d\n",sizeof(float));
printf("sizeof(double)=%d\n",sizeof(double));
printf("sizeof(longfloat)=%d\n",sizeof(longfloat));
printf("sizeof(longdouble)=%d\n",sizeof(longdouble));
}
程序:
验证有效位数
voidmain()
{floatx;doubley;
longfloatz;longdoublew;
x=1.0/3.0;y=1.0/3.0;
z=1.0/3.0;w=1.0/3.0;
}
3.4.2相等的判断
浮点数的不精确性的后果:
看似相等的数字不相等!
程序:
相等的判断
#include
voidmain()
{floatx;doubley;
x=1/3.;y=1/3.;
if(x==y)printf("OK\n");
elseprintf("NO\n");
if(fabs(x-y)<1e-6)printf("OK\n");
elseprintf("NO\n");
}
3.5字符型数据
3.5.1字符常数、字符串常数
内存单元的内容:
字符的ASCII码值。
字符常数
'a'
'z'
'A'
'Z'
'0'
'9'
'\n'
内存内容
97
122
65
90
48
57
10
字符串常数及内存内容:
字符串常数
内存内容
"china"
99,104,105,110,97,0
"IloveC"
73,32,108,111,118,101,32,67,0
3.5.2转义字符
\n
换行
\t
制表符
voidmain()
{printf("aaa\txxx\t99\n");
printf("bb\tyy\t88\n");
printf("ccc\tzzzz\t77\n");
}
\\
\
\'
'
\"
"
voidmain()
{printf("\\\'\"\n");
printf("\\\\\'\'\"\"\n");
}
\ddd
8进制数代表的字符
\xhh
16进制数代表的字符
voidmain()
{printf("\101\102\103\104\n");
printf("\141\142\143\144\n");
printf("\61\62\63\64\n");
printf("\x61\x62\x63\x64\n");
printf("\x41\x42\x43\x44\n");
printf("\x31\x32\x33\x34\n\n\n");
}
\b
退格
\r
回到本行开头
voidmain()
{printf("abcdefgh\b\bxxx\r123\n");}
3.5.3字符型变量
1字节:
存ASCII码值
voidmain()
{charc;
c='a';printf("%c,%x\n",c,c);/*内存:
0110,0011*/
c='b';printf("%c,%x\n",c,c);/*内存:
0110,0100*/
c='1';printf("%c,%x\n",c,c);/*内存:
0011,0001*/
c='2';printf("%c,%x\n",c,c);/*内存:
0011,0010*/
}
3.5.4字符型数据与整数的关系
程序:
验证等价关系,都是整数。
voidmain()
{charc1,c2;
c1=97;c2=99;
printf("%d,%d",c1,c2);
printf("%c,%c",c1,c2);
c1=c1-32;c2=c2-32;
printf("%d,%d",c1,c2);
printf("%c,%c",c1,c2);
}
程序:
验证不等价关系,字节大小不一样。
voidmain()
{inti;
charc;
c=127;/*c=128*/
i=c;
}
若c<=127,正常;若c>127,i为负数。
原因:
符号位扩展
3.6变量赋值与赋值表达式
3.6.1变量赋值
在函数中,变量定义语句位于所有语句之前。
变量使用的方法:
先定义,再赋值,再使用。
voidmain()
{inta,b,c;
a=3;b=5;
c=a+b;
}
注意警告错误:
未赋值,使用变量。
变量的定义和赋值可以同时完成。
(效率更高)
voidmain()
{inta=3,b=5,c;
c=a+b;
}
3.6.2赋值运算符和赋值表达式
赋值运算符:
=
赋值表达式的左值、右值的含义:
左值
表示一个具体的内存空间
右值
表示一个具体值
a=a的含义:
将a的值赋到a的空间中。
a=a+a的含义:
将a+a的值赋到a的空间中。
注意“赋值运算符”不是“等号”。
赋值表达式的值:
赋值表达式的右值。
程序:
测试赋值表达式的值。
voidmain()
{inta,b,c;
c=b=a=8;
c=(a=5)*(b=3);
c=(b=(a=3)+5)*2;
}
判断对错:
voidmain()
{inta=b=5;
}
3.6.3更多的赋值运算符
便利的赋值语句
等价语句
a+=3;
a=a+3;
c-=a+b;
c=c-(a+b);
a*=b+c;
a=a*(b+c);
a/=b+c;
a=a/(b+c);
voidmain()
{inta=1,b=2,c=10;
a+=3;
c-=a+b;
a*=b+c;
a/=b+c;
}
3.7各类数值型数据间的混合运算
voidmain()
{inta;floatb;
a=10.5+'a'+1.3+2*'d';
b=10.5+'a'+1.3+2*'d';
}
混合类型运算中,运算数要先转化为相同类型。
3.7.1自动的类型转换
运算规则:
小空间的类型转换为大空间的类型
char->int->longint->float->double
赋值规则:
运算结果值被转换为左值类型,再赋值。
3.7.2强制的类型转换
类型转换运算符:
(类型名)(表达式)
voidmain()
{floata;/*inta;*/
a=5/3;
a=(float)5/(float)3;
a=(float)5/3;
a=5/(float)3;
a=(float)(5/3);
}
3.8算术运算符和算术表达式
+,-,*,/,%(求余)
voidmain()
{inta=5,b=3,c;
c=a%b;
}
留意:
只能整数之间进行%运算。
3.8.1单独的++和--语句
i++和++i都等价i=i+1;
i--和--i都等价i=i-1;
voidmain()
{inta=5,b=3;
a++;
++a;
b--;
--b;
}
意义:
为了加快循环变量的计算。
3.8.2++、--和其他运算符构成的语句
i=1;j=i++;
j=?
i=1;j=++i
j=?
i=3;printf("%d",-i++);
显示-3,但i为4
i=3;k=(i++)+(i++)+(i++);
k:
9i:
6
i=3;k=(++i)+(++i)+(++i);
k:
18i:
6
i+++j;
等价于(i++)+j
写良好风格的C程序!
3.9逗号运算符和逗号表达式
表达式1,表达式2,……,表达式n;
表达式的值为表达式n的值。
voidmain()
{inta,b,c;
c=(a=1,b=2,a=a+2,b=b+2);
c=(a=1,b=2,a=a+2,b=b+2,a+b);
}
第2章数据类型、运算符与表达式
2.1数据类型概述
数据类型:
数据在内存中的存储方式、运算方法。
数据类型
符号
字节数
数值范围
整型
int
4
-231~231-1
单精度实型
float
4
1038……1038(6位有效数字)
双精度实型
double
8
-10308……10308(17位有效数字)
字符型
char
1
-128~127
整型数据的内存个数:
字符
短整数
长整数
2.2常量与变量
2.2.1常量
整型常量
10进制数:
0,2,637,32767,32768
8进制数:
072,0777,0100
16进制常数:
0x10001,0xABC,0xffff
实型常量
0.0,1.0,2.68,3.141593
0.0E0,6.226e4,6
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 基础