读书笔记1:
第一章
-
注释
所有的注释都会被预处理器拿掉,取而代之的是一个空格,因此,注释可以出现在任何空格可以出现的地方(tab制表符可用来缩进语句哦)
//下方将statement的内容注释掉了
#if 0
statement
#engif
-
在主函数前一些函数的声明被称为函数原型,告诉编译器这些以后将在源文件中定义的函数的特征
(在函数的参数中如果被声明为const,表示函数将不会修改函数调用者所传递的这两个参数)
//int表示了函数将返回一个整型值,void表示函数不接受任何参数
int main(void){
}
-
传址调用(数组参数..),传值调用(标量与常量..)
-
gets函数如果返回非NULL值,则表示成功读取,gets函数如果被调用但事实上不存在输入行时,则返回NULL值
-
NUL为字符串终止符('\0'),它本身并不被看做时字符串的一部分,有实际空间占用
"hello"//在内存中占据6字节的空间
-
当我们在正常输入字符串时,有时输入some string显示出来的确实somestring,因为以%s输入字符串时,会自动忽略一些空白
scanf中数组参数前不需要加上&,但如果你喜欢,即使加上它也没什么不对
#include <iostream>
#include <cstdio>
#define NUM 10
//输入两整型值和一个字符数组
int main(){
int quantity,price;
char department[NUM];
scanf("%d %d %s",&quantity,&price,department);
printf("%d %d %s",quantity,price,department);c
return 0;
}
-
关于int ch 可以接受字符((ch = getchar())!= EOF)
#include <iostream>
#include <cstdio>
#define NUM 10
int main(){
int max = 'c';//字符其实是小整型数,int足够存放下一个字符
//getchar()没有读入时返回的是一个EOF,EOF是整型数,但比字符型所占用内存空间要大
-
关于平常有时见到getchar()的问题,有两篇看到很好的文章,便于理解
//1
char ch = NULL;
while(ch = getchar() != EOF)//如果getcahr读入成功
//2
char ch = NULL;
ch = getchar();
//读入一个字符,如果接下来读入成功,则继续读入下一个
while(ch != EOF...){
ch = getchar();
}
练习:
/*编写一个程序,从标准输入读取几行输入
,每行输入都要打印到标准输入上,
前面要加上行号,在编写这个程序时要试图让程序能够处理的输入行的长度没有限制。。
*/
#include <stdio.h>
#include <stdlib.h>
#define NUM 10
int main(){
int ch;
int line = 0;
//行的起始位置
int beginning = 1;
while((ch = getchar()) != EOF){
if(beginning == 1){
beginning = 0;
line++;
printf("%d ",line);
}
putchar(ch);
if(ch == '\n'){
beginning = 1;
}
}
return 0;
}
第二章
-
翻译
组成一个程序的每个(或多个)源文件通过编译过程分别转换为目标代码,然后各个目标文件由连接器捆绑在一起,形成单一而完整的可执行程序
-
编译过程
首先是预处理器处理,预处理器在源代码上执行一些文本操作------如用实际值代替由#define指令的符号以及读入由#include指令包含的文件的内容
然后时解析源代码,判断语句的意思(优化器———提高效率,因为玉华过程需要额外的时间,在程序调试完毕并准备生成正式产品之前一般不进行这个过程)
-
执行
首先,程序必须载入到内存中,--宿主环境中(具备操作系统的环境),这个任务由操作系统完成。--独立环境中,程序的载入必须由手工安排,也可能是通过把可执行代码置入只读内存(ROM)来完成。
然后,程序的执行便开始,--宿主环境中,通常一个小型的启动程序与程序连接在一起,负责处理日常的一些事务,接着调用main函数
开始执行程序代码,绝大多数机器里,程序使用一个运行时堆栈,用于存储函数的局部变量和返回地址,程序也可以使用静态内存,存储于静态内存中的变量载程序的整个执行过程中将一直保存它们的值
最后一个阶段时程序的终止,可以由多种不同的原因引起
-
程序的形式
虽然一个源文件可以包含一个以上的函数,但每个函数都必须完整地出现于同一个文件中
-
三字母词
两个问号开头在尾随一个字符的形式一般不会出现其他表达形式中,以防引起误解
printf("detele file (are you really sure??)");
//有些编译器,,结果会产生]字符时,可能会惊讶
-
所以想使用一些字符时,需要用到转义字符
第三章
-
常量
在了解了一点c++的顶层const与底层const后回来总结
顶层const与底层const的理解
就拿指针而言:
顶层const表示指针本身是一个常量//int *const p1 = &i;||const int ci = 42;
底层const表示指针所指的对象是一个常量//const int *p2 = &c2;
常量指针:被指物时常量
指针常量:指针本身为一个常量
从csdn别的博客上看的很清晰明了的理解:
第五章
-
移位操作符:
右移位操作:逻辑移位,左边移入的用0填充,算术移位,左边移入的位由原先该值的符号位决定,符号位为1则移入1,为0则移入0
(算术左移和逻辑左移是相同的)
标准规定无符号值执行的所右移位操作都是逻辑移位,但对于有符号值,采用哪种方式取决于编译器
-
布尔值:
C语言并不具备显式的布尔类型,所以用整数来代替,零是假,任何非零值皆为真
-
左值与右值:
左值是那些可以出现在赋值符号左边的东西
右值是那些可以出现在赋值符号右边的东西
a = b+25;//a是左值,b+25是右值
b+25 = a;//是非法的,a可以为右值,因为每个位置都包含一个值,b+25并未标识一个特定的位置
b+25的结果必然保存于机器的某个地方,但是程序员并没有办法预测结果会存储与什么地方,也无法保证这个表达式的值下次还是会保存在相同的位置,所以字面值常量也是非法的