最近在看《C语言参考之旅》,感觉这本书不错,作者有用心去写,也写出了一些实际开发过程中雪要注意的细节,和高校教师所编的书还是有一定区别,初看好像很简单,但仔细看还是有一定的深度,适合掌握了一些基本语法的 C语言学习者学习,本文记下了阅读过程中自己认为比较重要而在学校教材里没有讲透彻的地方摘录下来
第一章 程序设计与C语言
1.什么是计算机程序?
计算机程序是指能使计算机做出信息处理行为并产生一定结果的指令集和(就像做菜的菜谱)
2.高级语言的执行方式?
( 1 )采用编译方式
编译----->编译----->链接----->生产可执行文件
(2)解释方式
利用针对某种高级语言的解释软件,解释所遇到的高级语言中的每个操作并完成这些操作所要执行的动作
高级程序源程序---------->解释软件---------->计算结果
第二章 数据和数据类型
1.几个重要概念
数据类型( C 是一门强类型语言 )
常量
‘10’和 10
字符常量(在内存中存放的不是字符本身,而是该字符所在机器采用的字符集的代码(ASCII))
注:
1)可以将一个字符常量赋给一个字符变量,不能将一个字符串常量赋给一个字符串变量(要用strcpy函数)
2)在C语言中,没有专门的字符串变量,而是用字符数组来存放一个字符串常量
变量的命名、定义、初始化
不好的示范:
total //记录的总数
totals //全部记录的总数
比较好的表示方法:
envry_total //某条记录的总数
all_total //全部记录的总数
注: 1)避免上面使用类似的变量名 2)每定义一个变量都要注释一下,养成良好的编程风格
整型变量
整型变量在内存中是以二进制的形式存放的,而数值(此处是整型)是一补码的形式存放的
负数 -123 的补码的求解如图:
整型变量的溢出
对于有符号数来说,如果对其最大值再加1,结果将变成其该数位所能表示的最小值
32767+1,应该等于32768,但因为发生溢出,最后得到的是16位的最小数-32768(16位机上整型为2个字节)
注:图的第二行是-32868的补码形式 & 作为16位整型可以表示的范围为负的2的15次方 ~ 2的15次方减 1
浮点数的存储 float f = 1.23456789
浮点数是按指数形式存储的,系统将一个实数分为小数部分和指数部分(上图只是为了示意,用十进制表示,在内存中是以二进制数来表示小数部分 ,用2的幂次来表示指数部分的)
注:
具体哪个部分占多数位由编译器决定
要防止两个数量级差别很大的数进行加减运算,因为舍入误差而产生与理论不同的结果123456789.0加上0.000123,按道理等于12345678.000123,将其转换成为具有7位精度的浮点数,0.1234567E+7, 第7位后面的数字都是无意义的
数据的输入/输出
printf( )函数
printf("格式控制字符串", 输出列表);
说明:
格式控制字符串分为格式字符串(%开头的)和非格式字符串(原样输出)
%f(以小数形式输出单、双精度实数)
* %g (以%f和%e中较短的输出宽度输出单、双精度实数)
注:
若不按变量的类型来输出的话可能会输出很意外的值:
假设系统中中int型占2个字节,char占1个字节,若变量的值为100(ASCII)对应的字符为d,若变量的值为300(ASCII最大值为255),这是printf( )会截断两个字节中的一个字节,这种阶段就相当于用256除这个数,余数为44(',')
关于输出的精度,输出格式以及其他细节的东西就具体用的时候查相关资料
scanf( )
scanf( "格式控制字符串",地址列表 );
注:
1)如果格式控制串中有非格式字符则输入时也要输入该非格式字符,
scanf("a=%d",b=%d",&a,&b);,字符'a'、'='、‘,’,'b',都属于非格式字符,在输入时,应该原样并按照位置输入。
2)在输入多个数据数据时,若格式控制串中没有非格式字符作为输入数据之间的间隔则可用空格,Tab或是回车作为间隔,C编译在碰到空格、Tab、回车或是非法数据(对“%d”输入“12B”时, B即为非法数据)即认为该数据结束
3)在输入字符数据时,若格式控制串中有非格式字符,则认为所有输入的字符均为有效字符( scanf("%c%c",&a,&b));,当输入A B(中间有个空格),函数把字符‘A’和‘B’中的空格也当作有效字符,‘A’赋给a,' '赋给b.
4) 如果输入的数据与输出的类型不一致时,虽然编译能够通过,但结果将不正确
5)' * ‘
'
' * '修饰符提供了截然不同的作用,放在%和格式字母中,其用于表示该输入项读入后不赋予相应的变量,即跳过该输入值( )
putchar( )(一次只能一个字符)
puts( ) & gets ( )
1) puts(s) (s为字符串指针或字符数组名)
2) puts("hello ,World");
gets(s) (s是字符串指针或字符数组名)
gets()是读取字符串直到回车符结束