用数字1代表真, 数字0代表假, 与计算机里面的“位”的概念相关。正好是1或0;
C语言的编译器默认假定函数的返回值是int 类型
数组作为函数参数时传递的是数组所在的内存位置,所以如果传递整个数组作为参数的话对数组元素的改变会影响到数组本身。
所有的全局变量的初始值都为0 ??
局部变量默认加 auto 前缀,每次会重新设定。如果加上 static 前缀,表明是静态变量,不会被重新设定。只在第一次调用时设定一下。如果变量值只需初始化一次不会再改变,设为静态变量会提高程序效率。如果需要变量的值在调用中被保留,也应该设为静态变量。
p177 声明变量并不会分配内存,只有在定义的时候才会。
p199 c语言要求结构初始化表达式必须是常量表达式。
char s1[8], s2[8], s3[8]; 6 7 printf("Enter text:\n"); 8 scanf("%7s%7s%7s", s1, s2, s3); 我这儿试验的是:读7个字符再读7个字符,即使这些字符都在一个字符串里。汗
字符串后加 \ 可以连接两行。同样可以用多个字符串合并为多行
这种情况下 printf 其实只接受了一个参数,因为编译器会把参数连接起来。
用指针获取数组元素的效率会更高。所以用 *arrayPtr;
word & 1 判断奇偶性的一个方法
按位异或历史上曾被汇编程序员用于设0或比较两值相等,但在C里面可能晦涩而不节省时间
位域很有意思,就是把一堆知道位数的数存在一个大数里,节省空间。可以用一个结构体表示
可扩展性:修改起来是否简单 可移植性:不同系统
预定义的一个好处是不需要判断参数类型 #define SQUARE(x) ((x) * (x)) 宏只是简单的对参数进行文本替换
实践中常把与定义的宏、结构类型的定义、函数原型的声明、全局变量的声明放在头文件中。
如果在语句块里定义了变量,就只能在该块中使用。
调用函数前一定要做声明,防止编译器对参数和返回类型做错误的判定。
static int movement; // 全局变量 int movement; 外部变量 如果在函数名前加 static, 同样只有本模块下可以用。
make是一个工具,根据makefile决定目标、obj和src之间的关系,并自动根据时间进行编译。
scanf(“%f”), 这个会跳过某个匹配 读一整行 scarf(“%[^\n]\n”, &str);
在检测EOF的时候记得要用 int 去存 char的值,不然有可能导致问题。
fopen r+: 可读可写 w+: 抹去再写 r+: 在最后写
联合 union, 在一个地方存几个成员的值,但一次只能存一个。有点像PHP里的变量,随便放。
volatile 修饰符:告诉编译器不要对该变量进行优化。 restrict 修饰符节: 该指针变量的指向是唯一一个某变量的指针。
命令行参数v; argc: 输入的参数个数 argv:字符指针数组,有argc+1个元素,最后一个是NULL,第一个指向当前程序。
sizeof 是一个操作符而不是函数调用。这个值一般在编译时就被确定了。
calloc 和 malloc 返回的都是通用指针 void*, 所以要转换为合适的类型。如果分配失败,会返回空指针null。
gcc -D DEBUG test.c 相当于前面定义了 #define DEBUG
#define DEBUG(fmt, ...) fprintf(stederr, fmt, VA_ARGS) 相当于在程序里 #ifdebug