c primer plus 笔记

1.sizeof和strlen都用%zd转换说明,strlen不计入字符串末尾的\0,sizeof要计入

2.strlen要使用string.h头文件,用于给出字符串中的字符长度

3.strlen和sizeof用法:strlen(name) sizeof(name)或sizeof(关键字)或sizeof(数字), 一般要加括号

4.c预处理器:形式:#define 符号常量名(通常全大写英文) 符号常量值 (没有等号,没有分号)
这叫编译时替换(compile-time substitution) 这样的常量叫明示常量(manifest constant)

5.修饰符z:与整形转换说明一起使用,表示size_t类型的值。size_t是sizeof返回的类型。size_t在stddef.h头文件中,该头文件包含在stdio.h中,size_t被称为底层类型(underlying type)
使用:printf(“%zd”,sizeof());
6.整型也有精度,如:把6以%.3d输出的结果是 006 字符串也有精度,表示打印字符的个数

7.对于6,假如以%05.3d输出,结果为:* 006* 。其中0表示以0填充空格,5表示字段宽度,.3表示精度。假如精度和0标记同时出现,忽略0标记
%05d 00006

8.转换(conversion):转换说明是翻译说明的意思,即把给定的值从二进制代码转换为用户要求的数

9.取模运算符%的作用:从一个数取出末尾n位:如125取最后一位,则用125%10(10^1);取1598的最后两位,则用1598%100(10^2)

10.char的范围:**0~255.假如用char表示336,336的二进制表示为0000000101010000,char只会取后八位,这相当于用336%256(2^8),得到80,对应ASCii为P,所以输出P

11.printf的返回值:返回打印字符的个数,如果输出错误,则返回一个负值

12.缓冲区(buffer)
两类缓冲:完全缓冲(一般在文件输入)/行缓冲(一般在键盘输入,按下enter后才刷新缓冲区,程序才可使用用户输入的字符)
回显:用户输入的字符直接显示在屏幕上
无缓冲输入(直接输入):回显用户输入的字符后立即重复打印该字符**无缓冲肯定回显
缓冲输入:按下enter后才重复打印刚输入的字符
getche()回显无缓冲 getch()无回显无缓冲

13.scanf和getchar读取文件结尾时将会返回EOF,EOF定义为-1
{
int ch; //因为EOF是-1,所以要用int而不能用char
while ((ch = getchar()) != EOF)
putchar(ch); //char是整数不会影响putchar,仍会打印等价字符
}
getchar会读取缓冲区中的第一个字符,即取走,使用循环可以把所有字符读走,相当于清除缓冲区

14.数据对象(data object) :用于储存值的数据存储区域统称数据对象。 使用变量名是标示对象的一种方法
左值(lvalue):用于标示特定数据对象的名称或表达式, 引用内存中的地址。 对象指的是实际的数据存储,而左值是用于标示或定位存储位置的标签
由于const创建的变量不可修改,所以创建了‘可修改的左值(modifiable lvalue)’的说法,用于标示可修改的对象。或者用术语‘对象定位值(object locator value)’
右值(rvalue):又叫‘表达式的值(value of expression)’

15.运算对象(operand)

16.运算符(operator)
二元运算符:+ — 需要两个运算对象才能完成操作 (当+ -表示正负时为一元)

17.整数除法结果的小数部分会被丢弃,这叫截断(truncation)

18.sizeof 和 size_t
sizeof返回size_t类型的值,这是一个无符号整数类型
{
size_t intsize;
intsize = sizeof (int);
printf(“%zd”, intsize); // 如果不支持%zd,则用%u或%lu
}

19.typedef:为现有类型创建别名
typedef double real; ——-为double创建real的别名

20.求模运算符(modulus operator):只用于整数
负数求模:第一个运算对象是(正)负数,那么求模结果也为(正)负数
a % b == a - (a/b)*b

21.递增运算符(increment operator) :对于++i和i++不同的地方,尽量别使用。++i表示先递增在使用;i++表示先使用再递增。例: y = 2; n = 3; l = (y + n++)*6; ——l == 30
用于while优化:把循环测试和更新循环放在一处
shoe = 3.0;
while(shoe < 18.5) {
foot = SCALE* size;
++shoe;
}
优化:
shoe = 2.0;
while(++shoe < 18.5) { //假如使用shoe++,会先与18.5比较在++,最终shoe能达到19
foot = SCALE * size;
}

注意:* 如果一个变量出现在一个函数的多个参数中,不要对该变量使用递增或递减运算符
* 如果一个变量多次出现在一个表达式里,不要对该变量使用递增或递减运算符
*一般出问题都是后自增
22.递增和递减运算符只能影响一个可修改的左值。递增和递减运算符优先级仅次于圆括号

23.一个同等优先级且没有共同运算对象的表达式,运算顺序不一定是从左到右,取决于编译器

24.表达式(expression):由运算符和运算对象组成,最简单的表达式是一个单独的运算对象,包括常量或变量。(包括函数调用) 子表达式(subexpression)
语句(statement):以分号结尾的计算机指令,但指令不一定是语句。如 x = 6 + (y = 5); 表达式y = 5是指令,但不是语句

注意:声明不是表达式语句。赋值和函数调用都是表达式

25.副作用(side effect):对数据对象或文件进行修改。如states = 50;副作用是把states设为50,主要目的是对states求值。使用这些运算符主要是使用副作用

26.完整表达式(full expression):指这个表达式不是另一个更大表达是的子表达式,该表达式结束为一个序列点。

27.自动类型转换问题:
当表达式需要类型转换时:
1)char short被转换成int,unsigned short被转换成unsigned int
2)涉及两种类型的计算时,转换成两种类型中的较高级别
3)赋值时,最终结果转换成被赋值变量的类型,可能升级(promotion)或降级(demotion)
具体规则为:目标类型是无符号整型时,且待赋的值是整数,额外的位将忽略。如目标为8位的char,待赋值是原始值取模256
浮点类型降级为整数类型时,原来的浮点值会被截断

28.scanf的返回值
(1)正整数:表示正确输入参数的个数
(2)0:表示输入不匹配,无法正确输入任何值
(3)EOF(-1):表示输入流结束
如何使用:status = scanf(“%d”, &sum); while(scanf(“%d”, &a) != EOF)

29.char 1个字节 int 4个字节

30.%hd 短整形 %Lf长双精度

**31.一个字节可表示:**0~255, -128~127
float :23位小数部分,4个字节 double:52位小数, 8个字节, 15~16位有效数字

32.函数是c的基本模块, 花括号标记开始和结束

33.关键字keyword(如int, auto, extern, while, if, goto, _Alignas, _Alignof)不能用作函数名或变量名
标识符identifier(如num)也就是一个变量,函数或其他实体的名称(编译器识别前63个)
保留标示符:以下划线字符开头的标识符和标准库函数名,如printf()不会引起语法错误,但不能用

34.名称的第一个字符不能是数字, 可以是字母,字符,下划线,c语言名称区分大小写

35.int main() {
printf("....");
}

圆括号中的内容是有main函数传递给printf函数的信息,是实际参数actual argument

36.待打印的值不一定是变量

37.函数原型(prototype):前置声明,也叫函数声明(function declaration)
函数调用(function call): 函数名 + (可不写);
函数定义(。。。。)

38.标准include文件为标准库函数提供了函数原型

39.回车即发送换行符,利用两个getchar(),能使程序暂停

40.%.2f 保留小数点后两位

41.int arr[] = {10, 20, 30} -2[arr] == -30 -1[arr] == -20 这种写法是对的,但别用

42.数组存储在连续的空间里,根据base address 和下标推测地址, 有些数据占有多个字节,以基址为地址
(address = baseadress + 下标 × 数据类型字节数)

43.下标(index) 下标越界,会产生不确定的错误

44.字符串以‘\0’结尾,占1byte。printf(“%s”)假如找不到‘\0’会一直查找下去
\0不是0,是Null字符,非打印字符,ASCII码值是0

45.数组名是指针常量 inta[100], 则a = &a[0]

46.使用数组的函数要求2个参数:(1) base address 数组名 (2)数组长度
例:void Fun (int temp[] , intk); ——函数原型
int temp[31];
Fun (temp, 31); ——-函数调用
注意:数组名是常量,函数定义中的数组名作为形参,必定是一个变量,但不是数组名,这里也不是定义了数组

47.32位系统中,指针为4byte

48.字(word) :计算机数据出来时,一次存取,加工,传送的数据长度称为字(word), 一般由一个或多个字节组成

49.输出:八进制:%0 十六进制:%X 显示前缀:%#0 %#X

50.short 16位(-35768,32767) int / long 32位(-2147483648, 2147483647) longlong 64位

51.在数字常量后面加后缀,表示以某种方式存储
如:7L存储为long类型 0.7f 存储为float(默认为double) 7LL longlong 7ul unsigned long
但在转换说明中,只能用小写:如%l0 %lx

52.把65537以二进制表示为32位数为:00000000000000010000000000000001
使用%hd输出,printf只会查看后16位,所以输出1

53.beep = ‘\7’ = ‘\07’ = ‘\007’ 表示八进制的7对应的字符
‘\Xhh’(h是0~f中的一个数) 表示十六进制的ASCII码特殊表示
\0oo \Xhh 转义序列之ASCII码的特殊表示, 优点:可内嵌入C的字符串中

54.-bool类型只占一位

55.头文件:stdint.h(或inttypes.h)叫做可移植类型
精确宽度整数类型:int 32_t : 32位系统中时,等于int , int为16位,long为32位系统中时,等于long
将数据类型替换为当前系统匹配,或者说,你要几位就用几位
int_least8_t:一定是至少有指定宽度的最小整数类型
intmax_t:最大整数类型

56.%d %f…... 叫转换说明

57.inttypes.h头文件中定义了PRID32字符串宏,代表打印32位有符号值的合适转换说明
printf(“me = % “PRID32” \n”, me32);

58.科学计数法(用户使用):
十进制:1.56E12(中间不能有空格) %e
十六进制:%a 例: 0xa.1fp10 –a表示10 .1表示1/16 .0f表示15×16-2 = 15/256 0x前缀不能省 p表示2的幂 —-(10+1/16+15/256)×1024

59.float some: ——计算机运行过程:将4.0*2.0以double计算,将获得的值截断成float
some = 4.0*2.0;

60.上溢;用一个无穷大的特定值表示 下溢:指数最小,如:0.1234E-10 除以10 –>0.0123E-10(仅为假设),假设除以一个很大的数,会变为全0

61.float a=2.0e20 a+1.0-a=0 原因:1在第21位,float存不了

62.printf(“%zd\n”, sizeof(int)); —>4bytes

63.c编译器把浮点数转换成整数时,直接丢弃小数部分

64.传递给函数的信息称为参数, 一个字符串为一个参数

65.\r 回到当前行的起始处

66.缓冲区(buffer) 刷新缓冲区:缓冲区满,遇到换行字符或需要输入时

67.双引号不是字符串的一部分

**68.**char name[5] :分配5个字节

69.scanf读取字符串,遇到第一个空白就会停止,即只读取第一个单词

70.“X”是派生类型,由两个字符组成 ‘X’是基本类型,是一个字符

71.printf输出长字符串:(1)两个Printf (2)反斜杠+enter (3)多个双引号括起,用空白隔开

72.float和double,在printf中都使用%f,%e,%E,%g,%G转换说明,而scanf()中上述只用于float,double要加l,而加L表示为long double类型

73.scanf会跳过下一个输入前的所以空白(除char),直至遇到非所要求字符,并不会把该字符读取,下一次读取时,程序从丢弃的那个字符开始。转换说明与输入不符出错是会卡在那儿,无法读取,返回0, 不可利用字段宽度让只有一个%s的scanf读取多个单词,即scanf每次只能读一个单词

74.scanf中的%c:
scanf(“%c”, &ch)从输入的第一个字符开始读取(包括空白字符:换行,制表符,空格)
scanf(” %c”, &ch)从第一个非空白字符开始读取

75.修饰符修饰转换说明, 例:printf(”%*d”,width,number)width对应, number对应b
scanf”%d”, 表示跳过输入

76.花括号以及被花括号括起来的部分叫做块(block)

77.operator运算符

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值