C 语言中有 32 个关键字。这是留个编译器用的特殊字符串,用户不可使用。web
sizeof 和 return 是 C 语言中的两个特殊关键字。svg
sizeof 用于计算变量所占内存空间的字节数,返回值为 unsigned long 无符号长整型。sizeof 不依赖底层操做系统,能够在编译时直接获得。函数
有两种用法:优化
int a; printf("%lu\n", sizeof(a)); printf("%lu\n", sizeof a);
return 用于执行返回操做,退出当前函数,执行函数调用栈的上一层调用者。ui
C 语言中,各类数据类型所占空间大小,跟具体的编译平台相关。例如在 32bit 机器上 int 类型占 4Byte。this
CPU 在一个周期内所能处理数据的最优大小,就是 CPU 的位数,也是对应平台上 int 类型的大小。spa
全部的数值类型,默认都是带符号的。若是想使用不带符号的数值,必须用 unsigned 关键字明确指定,例如 unsigned int
。操作系统
long long l
表示更大的数据。浮点数有多种不一样的表示方法,虽然表示范围很大,可是可能有精度丢失。浮点数默认是 double 类型,但能够在浮点数末尾加个 f 来表示采用 float 类型,例如:指针
float f = 3.14 * 2; // 3.14 会分配一个 double 类型的空间 float f2 = 1.234f + 2.333f;
全部的数值类型,默认都是带符号的。若是想使用不带符号的数值,必须用 unsigned 关键字明确指定,例如 unsigned int
。code
一般来讲,能够进行各类运算的数值用默认的有符号类型,而单纯的数据(例如信号、二进制数据)则使用无符号的类型。
#include <stdio.h> int main() { char c1 = 0x80; unsigned char c2 = 0x80; printf("0x%x\t0x%x\n", c1, c2); int i; for (i = 0; i < 8; i++) { c1 = c1 >> 1; c2 = c2 >> 1; printf("0x%x\t0x%x\n", c1, c2); } }
输出:
0xffffff80 0x80 0xffffffc0 0x40 0xffffffe0 0x20 0xfffffff0 0x10 0xfffffff8 0x8 0xfffffffc 0x4 0xfffffffe 0x2 0xffffffff 0x1 0xffffffff 0x0
void 至关于一个占位符,能够声明变量或返回值,可是void 类型的变量不可直接使用,须要强制转换为其余类型才能够。
void a; void fun();
void 一般用于:
每种数据类型在存储数据时,都有范围限制。若是把超过限制的数据存入某个变量,会致使各类异常情况。编译时会有警告。
char c = 666; printf("%d", c);
输出:
/code/main.c: In function ‘main’: /code/main.c:5:1: warning: overflow in implicit constant conversion [-Woverflow] char c = 666; ^ -102
struct、union、enum 是 3 种自定义的数据类型,typedef 是为数据类型起一个别名。
自定义数据类型,就是把已有的数据类型进行组合,获得一个匹配实际的资源类型的存储类型。
使用自定义数据类型时,必须在变量前指明这个变量是哪个数据类型,例如 struct MyStruct s;
struct 结构体就是变量的集合,把已有的类型组合到一块儿,造成新的类型的语句。struct 中的变量按照顺序存储。
struct 也是一条语句,定义时必须以分号结尾。使用时必须用 struct 自定义的名称 变量名
的形式来声明变量,示例:
#include <stdio.h> struct People { unsigned int age; char* name; }; // 这里必须加分号 int main() { struct People s = {20, "jack"}; printf("%d, %s", s.age, s.name); }
union 共用体中,全部变量共享同一块内存。由于内存的起始地址重合,任什么时候刻都只能存储一个变量。
#include <stdio.h> union myUnion { unsigned int i; char c; }; // 这里必须加分号 int main() { union myUnion s; s.i = 666; printf("%d", s.i);// s 中只有 i 一个元素,若是打印 c 会报错 s.c = 'a'; printf("%c", s.c);// s 中只有 c 一个元素,若是打印 i 会报错 }
输出为:``666a
C 语言中能用 enum 实现的代码,均可以不用 enum 实现。
enum 是常量的集合。例如一周的七天,能够用 #define 或 const int 来定义,也能够打包放到 enum 中。enum 特色是:
下面示例中的三种写法等价,用法是同样的:
#include <stdio.h> /* #define SUN 7 #define MON 1 #define TUE 2 const int SUN = 7; const int MON = 1; const int TUE = 2; */ enum {SUN = 0, MON, TUE}; // 默认第一个元素是0,后序元素依次加一 int main() { printf("%d\n", TUE); }
typedef 为已有的数据类型起别名,可让程序可读性更高。一般在 Linux 内核源码中,用 typedef 起的别名,后缀都是 _t
。
#include <stdio.h> typedef unsigned int uint_t; int main() { uint_t a = 666; printf("%d", a); return 0; }
if (3 < 4) {//...}
语法:
switch(整型变量) { case 整型数字: // 执行语句 break; // 必须加,不然会向下执行 default: // 上面没有匹配到时,默认执行这里的语句 }
#include <stdio.h> int main() { int i; for (i = 0; i < 5; i++) { switch (i/3) { case 0: printf("%d\n", i); case 1: printf("%d\n", i); case 2: printf("%d\n", i); break; default: printf("this is default\n"); } } }
由于没加 break 会致使 switch case 贯穿,输出以下:
0 0 0 1 1 1 2 2 2 3 3 4 4
跟次数相关。
C 语言中,for 循环的初始化语句中,必须用已经声明过的变量,比较差:
int i; for (i = 0; i < 10; i++) {//...}
至少执行一次。
int a = 666; do { printf("%d", a); } while (a++ < 0);
跟条件相关。
continue:结束本次循环,开始下次循环
break:结束语句所在的循环
goto:跳转到指定语句位置
变量的数据类型定义以后,变量所占用的存储空间大小就固定了。变量的具体存储位置,就须要用类型修饰符来控制。默认的类型是 auto,int a
等价于 auto int a
。
static int a;
static int fun(){}