第1章初识c语言
第2章c语言概述
2.1
//这是一个注释 该注释只能写一行
/*这是一个注释*/ 注释没有行数限制
#include<stdio.h> /*程序第一行,把stdio.h文件中所有内容都输入该行*/
/*#include这行代码是c预处理指令。通常c编译器在编译前会 对源代码做一些准备工作,即预处理*/
/*stdio.h文件包含了供编译器使用的输入和输出函数,如无特 殊情况,程序一般要包含stdio.h文件*/
int main(void) /*主函数,总是被第一个调用,main()函数在一个函数中 唯一存在,main()函数必须是一个程序开始的函数。()代 表main是函数。*/
{
int num; /*使用一个名为num的变量并且num是int类型*/
变量的命名要具有可读性,比如num,age,long等
num=1; /*为num赋值,把右侧的值赋值到左边*/
printf('My favorite num is %d because it is first.\n',num); /*调用printf函数,printf()含义是把括号内容打印出来*/
%d是占位符告诉计算机以何种形式输出num的值,打印在何处
return 0; /*程序的最后一个语句*/
c函数可以给调用方提供(或返回)一个数。目前,可以暂时把该行看成是结束main()函数的要求。
}
运行后编辑器会对代码实行编译生存o文件,然后使用构建,用连接器和o文件链接产生可执行文件exe
2.2简单的程序结构
int main()是函数头
花括号中是函数体
第3章数据和C
3.1示例程序
scanf()函数用于读取键盘的输入,%f说明scanf()要读取用户从键盘输入的浮点数,&weight告诉scanf()把输入的值赋给名为weight的变量。scanf()函数使用&符号表明找到weight变量的地点。
%d是整数占位符,%f是浮点数占位符,%.2f中的.2用于精确控制输出,指定输出的浮点数只显示小数点后两位,scanf()函数用于读取键盘的输入。
/*bit(比特)计算机中最小单位
byte(字节)=8bit
kb=1024byte
mb=1024kb*/
3.2变量与常量
有些数据类型在程序使用之前就已经预先设定好,在整个程序运行过程中没有变化,这些称为常量
其他数据类型在程序运行期间可能会改变或被赋值,这些称为变量。
3.3数据类型关键字
int //整型
short //短整型
long //长整型
unsigned //正整型
char //字符数据类型,用于指定字母和其他字符(如#,*,$等),也可以表示较小的整数
float //单精度浮点数
double //双精度浮点数
//signed
//void
//表示布尔值(true或false)_Bool
//表示复数_Complex
//表示虚数_Imaginary
位、字节与字
计算机的最小储存单元是位(bit),可以储存0或1
字节(byte)
字(word)
bit(比特)计算机中最小单位
byte(字节)=8bit
kb=1024byte
mb=1024kb
浮点数与整数
整数由没有小数部分,浮点数有
浮点数与整数存储方式不同,浮点数的存储分3个部分,对于3.14159中分为符号(+),小数(0.314159),指数(10^1或E1)3部分,浮点数常用e计数法,3.16x10^6可写为3.16E6
3.4,c语言基本数据类型
3.41
int类型
int类型是有符号的整型,即值可以为正整数,负整数,零。
一般用16位来储存int值,取值范围为—32768(—2^15)到—32767(2^15 —1)
unsigned int(正整数)取值为0到2^16 —1
声明int值
可以分别声明各变量也可以一个变量中声明多个
初始化变量
即为变量赋一个初始值,一般直接在声明中完成
打印int值
占位符%d用于对int格式的值进行代替,但是要确保占位符与值一一对应,这种错误编译器不会捕获
例:int num=1
printf("%d minus %d is %d/n",num,num)
其中遗漏最后一个%d参数,编译器会在系统中选出垃圾词填上
八进制和十六进制
c语言整型常量一般为十进制,0x或0X前缀表示16进制,0前缀表示8进制
使用不同进制是为了方便,不会影响数被储存的方式,因为计算机内部都以2进制进行编码。
显示八进制和十六进制
8进制占位符为%o,16进制占位符为%x
%d 整型int
%ld 长整型long (int)
%lld 长长整型long long (int)
%hd 短整型short int
%u 无符号整型unsigned int
%hu 无符号短整型unsigned short int
%lu 无符号长整形unsigned long int
%llu 无符号长长整型unsigned long long
%f 浮点型float
double比较特殊,它的输入占位符是%lf,输出只能是%f
%c 字符型char
%s 字符串
注:占位符中字母只能小写
int x=100
printf("dec=%d,octal=%o,hex=%x\n"x,x,x)
printf("dec=%d,octal=%#o,hex=%#x\n"x,x,x)
输出结果如下
dec=100,octal=144,hex=64
dec=100,octal=0144,hex=0x64
如果要在八进制和十六进制前显示0和0x前缀,要分别在转换说明(占位符)中加入#
3.42 其他整数类型
short int(简写为short)
long int(long)
long long int(long long)
unsigned int(unsigned)
//用于非负场合,如果16位则取值范围是0到65535而不是-32768到32767,如果使用负数则会导出垃圾数
c语言规定short占用的空间不多于int,long不少于int。
现在计算机的常用设置时long long占64位,long占32位,short占16位,int占16位或32位,实际使用过程中,有些类型之间常有重叠。
通常,代码程序使用的数字都被存储为int类型,八进制和十六进制也被是为int类型,如果值太大,编译器会依次使用unsigned int, long,unsigned long等
如果需要把一个较小的数看成long类型,可以在值的末尾加上L(l),一般使用大写L,其可读性较强,如果用unsigned long long可以5ULL或5LLU
整数溢出
当整数达到它能表示的最大值时会重新从起点开始,unsigned int超过最大值时会从零开始,而int会从-2147483648开始。当其溢出时,系统不会通知用户,编程时需注意。
注意:在使用printf()函数时,切记检查每个待打印的值都有对应的转换说明,还要检查转换说明的类型是否与待打印值的类型相匹配。
3.43使用字符:char类型
char类型用于存储字符,但是从技术层面来看,char类型是整数类型,因为计算机实际上存储的是整数而不是字符,计算机使用数字编码(一般是ascii码)。
在c语言中,用单引号括起来的单个字符被称为字符常量。编译器一发现'A',就会将其转换成相对应的代码值。单引号必不可少
非打印字符
单引号只使用于字符、数字和标点符号,有些代表行为的字符(如,退格、换行、终端响铃或蜂鸣)。
1,使用ascii
2,使用特殊的符号序列表示一些特殊字符。这些符号序列被称为转义序列。把转义序列赋给字符变量时,必须使用单引号把转义序列括起来。
\a --警报(ANSI C)
\b --退格
\f --换页
\n --换行
\r --回车
\t --水平制表符
\v --垂直制表符
\ --反斜杠(\)
’ --单引号
" --双引号
? --问号
\0oo --八进制值( oo 必须是有效的八进制数,即每个 o 可表示 0 ~7 中的一个数)
\xhh --十六进制( hh 必须是有效的十六进制数,即每个 h 可表示 0 ~f 中的一个数)
\a只会发出蜂鸣不会移动光标,\f会把光标移动到下页开始位置,\n会把光标移动到下一行开始处。
如果打印下面一行内容
gramps,"a \ is a backslash."
printf("gramps,\"\\ is a backslash.\"\n")
对于特殊字符前应加一个转义字符 \
注意:使用ASCII码时,注意数字和数字字符的区别。例如,字符4对应的ASCII码是52。'4'表示字符4,而不是数值4。无论是普通字符还是转义序列,只要是双引号括起来的字符集合,就无需
用单引号括起来。双引号中的字符集合叫做字符串。
打印字符
char ch=C
printf("The code for %c is %d. ")
输出结果:
The code for C is 67
有无符号
有些编译器把char实现为有符号类型,这意味着char可表示的范围是-128~127。而有些C编译器把char实现为无符号类型,那么char可表示的范围是0~255。
signed char表示有符号类型,unsigned char 表示无符号类型。
_Bool类型
1表示true,0表示false
3.46 float,double和long double
计数法,科学计数法,指数计数法(e计数法)
c标准规定,float类型必须至少能表示6位有效数字,且取值范围至少是10^-37~10^37。double类型和float类型最小取值范围相同,但至少必须能表示10位有效数字。long double比double精度更高,至少与double类型精度相同。
浮点型常量
浮点常量基本类型:有符号的数字(包括小数点),后面紧跟e或E(数字和e之间不能加空格),最后是一个有符号数表示10的指数。
默认情况下,编译器假定浮点型常量是double类型的精度。储存器使用双精度进行乘法运算,然后将结果截断成float类型的宽度。这样会使运行速度减慢。
在浮点数后加f或F后缀,编译器会将浮点数常量看做float类型,加L或l,会将其看做long double。
打印浮点型
用%f转换说明打印十进制计数法的float和double类型浮点数,用%e打印指数计数法的浮点数。如果系统支持十六进制的浮点数,可用a与A分别代替e与E。打印long double时用%Lf,%Le,%La.。
浮点数的上溢与下溢
计算数目过大超过范围称为上溢出,有结果,但是是垃圾词
计算数目过小时,虽然得到了结果,但是在计算过程中却损失了原末尾有效位上的数字,这个过程叫下溢
还有中特殊的浮点数值,NAN(not a number)。例如给sin()一个大于一的参数,就会返回NAN值,或nan。
浮点数舍入错误
给定一个数加1再减去这个数会是1吗,未必
计算机可能会缺少足够的小说位来运算
复数和虚数类型
float _Complex
float_Imaginary
传递给函数的信息被称为参数。
刷新输出
最初printf()语句把输出发送到一个叫缓冲区的中间缓存区域,然后缓冲区中的内容再不断被发送到屏幕中。c语言明确规定了何时把缓冲区发送到屏幕:缓冲区满,遇到换行字符或需要输入时。(从缓冲区把数据发送到屏幕或文件被称为刷新缓冲区)
旧版编译器遇到scanf()也不会强制刷新缓冲区,程序会停在那里不显示任何内容,等待用户输入数据。这种情况下,可以使用换行符刷新缓冲区。