目录
程序
1. 程序是对数据的运算。
2. 仅数据的类型决定其在内存中的布局与大小。
程序结构
主函数
1. 形式为 int main(){语句块}
。
2. 程序仅仅执行主函数,从语句块第一条语句开始,执行完所有语句或遇到 return
关键字结束。但可以在主函数中对其它函数进行嵌套调用,如 printf()
函数。
预处理指令
预处理指令在正式编译前,由预处理程序执行完成。
#include
文件包含命令,用法为 #include <c文件路径>
或#include "c文件路径"
。使用<>
时,编译器会在系统路径中寻找文件;使用" "
时,则会优先在编译器安装目录下的 include 文件夹下寻找,找不到的话再去系统路径中找。
包含标准头文件时用<>
,包含自定义头文件时用" "
,会是一个好习惯。
在控制台编译时,可以使用 gcc 命令的 -I 选项增加搜寻路径,那么编译器会优先在所增加的路径中寻找。
gcc -I 路径
#define、#undef
宏定义命令,用法为#define 宏名 字符序列
,其中字符序列可以为数字、表达式、if 语句、函数等。它让我们可以给一个需要频繁使用到的表达式起一个名字,从而简化代码。
在预处理过程中,代码中的所有宏会被简单替换成宏定义时的字符序列,称为 宏展开 ,除非超出了宏的作用域。
#undef
表示宏的作用域到此为止。
#if、 #ifdef、 #ifndef、 #elif、 #else、 #endif
条件编译命令,其中#ifdef 宏名
表示如果定义了宏则执行语句下面的程序段,#ifndef 宏名
反之。其余略。
#line
用法为#line 整数行 文件名
,其中 行数 与 文件名 顺序不能对调,且文件名要加" "
。本质上是对__LINE__
和__FILE__
重新赋值。
int main(){
#line 9 "a.c"
printf("%d\t%s", __LINE__, __FILE__);
}
9 a.c
#error、#warning
手动抛出错误或警告。
数据类型
变量的声明与定义
格式:type variable_name1 = value, variable_name2 = value;
extern int a;
int b=1, c;
左值与右值
lvalue:指向内存位置的表达式,可以在赋值运算符左边或者右边。
rvalue:存储在内存中的值,只能在赋值运算符右边,被赋给左值。
int b=1;
2 = b;
提示错误:
error:lvalue requires as left operand of assignment
整数类型
1. char 和 int、unsigned int 。
2. 其中 char 可细分为signed char与unsigned char。
3. int 可细分为 short(2字节) 与 long(4字节) ,而 unsigned int 与 int 不是包含关系,而是并列, int 等同于 signed int 。
4. unsigned int 可细分为 unsigned short 与 unsigned long 。
5. 其中unsigned顾名思义,无符号的。整数的符号,首先想到的也就只有负号了。unsigned作为修饰其含义为 非负的 。
unsigned char a = -1;
unsigned short b = -1;
unsigned long c = -1;
printf("%d\n%u\n%lu\n",a,b,c);
255
65535
4294967295
注意:输出时,printf()
函数的格式化说明符需与变量类型保持对应,否则会发生类型转换。
另外,%lu
处若为%d
、%u
均会提出警告,表示arguments of type 'long unsigned int'
不应对应 format '%d'
或 format '%u'
。
且%u
处为%d
时却不会提出警告,明明 argument b
也不是 format '%d'
所expect
的 type 'int'
。猜测是因为 (signed) int
的取值范围必能包含(signed) short
的取值范围,故无需警告。
6. char、int、short、long的取值范围均包含正与负,赋正值或赋负值都可。
char a = -1;
int b = -1;
short c = -1;
long d = -1;
printf("%d\n%d\n%d\n%d",a,b,c,d);
-1
-1
-1
-1
7. 各整数类型的取值范围首先取决于其长度,再根据是否 unsigned 修饰进行进一步运算即可。
char a;
printf("char型占用内存:%d byte,故unsigned char型取值范围为:0~%d\n",sizeof(a),(int)(pow(2,(int)(8*sizeof(a))))-1);
short b;
printf("short型占用内存:%d byte,故unsigned short型取值范围为:0~%d\n",sizeof(b),(int)(pow(2,(int)(8*sizeof(b))))-1);
long c;
printf("long型占用内存:%d byte,故unsigned long型取值范围为:0~%d\n",sizeof(c),(int)(pow(2,(int)(8*sizeof(c))))-1);
char型占用内存:1 byte,故unsigned char型取值范围为:0~255
short型占用内存:2 byte,故unsigned short型取值范围为:0~65535
long型占用内存:4 byte,故unsigned long型取值范围为:0~2147483646
int型取值范围为short与long的合集。
浮点数类型
float a;
double b;
long double c;
printf("float型占用内存:%d byte\ndouble型占用内存:%d byte\nlong double型占用内存:%d byte\n",sizeof(a),sizeof(b),sizeof(c));
printf("float型取值范围为:%e~%e\ndouble型取值范围为:%e~%e\nlong double型取值范围为:%e~%e\n",FLT_MIN,FLT_MAX,DBL_MIN