C 语言使用基础
关键字
数据类型关键字
- char 字符型
- short 短整型数据,修饰符int ,short int a= 10;一般被省略为int a =10;
- int 整型数据,通常为编译器指定的机器字长
- long 长整型数据,修饰int,一般省略被修饰的int
- float 单精度浮点型数据
- double 双精度浮点型数据
- unsigned,signed 修饰符,分别表示无符号和有符号。
- void 声明函数无返回值或无参数,修饰指针时表示无类型指针,void不可用来定义变量,但可以用它来修饰各种变量;
- struct 结构体声明
- union 用来声明共用体或者叫联合体
- enum 枚举声明
控制语句关键字
if,else,for,do,while,break,case,continue,default,return,switch,goto(尽量不用)
存储语句关键字
- auto 声明自动变量
- extern 声明变量外部可用,可以置于变量或者函数前,以表示变量或者函数的定义在别的文件中,可以外部使用;extern 存储类用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。当您使用 ‘extern’ 时,对于无法初始化的变量,会把变量名指向一个之前定义过的存储位置。
- static 声明静态变量,static修饰的变量存储在静态变量区,修饰全局变量时,表示该变量为全局静态变量,作用域为当前文件;修饰函数时表示函数作用域为当前文件内部; 修饰局部变量时,表示该变量为静态局部变量,只被初始化一次,赋值之后值会保持最新的值,也就是说局部静态变量的生命周期被扩展到整个程序运行的时间段内。
- register 声明寄存器变量,修饰符暗示编译程序相应的变量将被频繁地使用,如果可能的话,应将其保存在CPU的寄存器中,以加快其存储速度。register变量必须是能被CPU所接受的类型,这通常意味着register变量必须是一个单个的值,并且长度应该小于或者等于整型的长度。不过,有些机器的寄存器也能存放浮点数。因为register变量可能不存放在内存中,所以不能用“&”来获取register修饰变量的地址
其它关键字
- const 表示被修饰的变量不可被当前线程或进程改变
- sizeof 计算数据类型长度或者变量占内存空间大小
- typedef 为某种数据类型定义一个新的名字
- volatile 确保本条指令不会因编译器的优化而省略,且要求每次直接读值,简单地说就是防止编译器对代码进行优化。
C程序结构
组成结构
- 预处理指令
C 预处理器不是编译器的组成部分,但是它是编译过程中一个单独的步骤。简言之,C 预处理器只不过是一个文本替换工具而已,它们会指示编译器在实际编译之前完成所需的预处理。我们将把 C 预处理器(C Preprocessor)简写为 CPP。 所有的预处理器命令都是以井号(#)开头。它必须是第一个非空字符,为了增强可读性,预处理器指令应从第一列开始。下面列出了所有重要的预处理器指令:
指令 | 描述 | 示例 |
---|---|---|
#define | 定义宏 | #define MAX_ARRAY_LENGTH 20 这个指令告诉 CPP 把所有的 MAX_ARRAY_LENGTH 替换为 20。使用 #define 定义常量来增强可读性。 |
#include | 包含一个源代码文件 | #include <stdio.h> #include “myheader.h” 告诉 CPP 从系统库中获取 stdio.h,并添加文本到当前的源文件中。下一行告诉 CPP 从本地目录中获取 myheader.h,并添加内容到当前的源文件中。 |
#undef | 取消已定义的宏 | #undef FILE_SIZE #define FILE_SIZE 42 告诉 CPP 取消已定义的 FILE_SIZE,并定义它为 42 |
#ifdef | 如果宏已经定义,则返回真 | #ifdef DEBUG /* Your debugging statements here */ #endif 这个指令告诉 CPP 如果定义了 DEBUG,则执行处理语句。在编译时,如果您向 gcc 编译器传递了 -DDEBUG 开关量,这个指令就非常有用。它定义了 DEBUG,您可以在编译期间随时开启或关闭调试 |
#ifndef | 如果宏没有定义,则返回真 | #ifndef MESSAGE #define MESSAGE “You wish!” #endif 这个指令告诉 CPP 只有当 MESSAGE 未定义时,才定义 MESSAGE。 |
#if | 如果给定条件为真,则编译下面代码 | |
#else | #if 的替代方案 | |
#elif | 如果前面的 #if 给定条件不为真,当前条件为真,则编译下面代码 | |
#endif | 结束一个 #if……#else 条件编译块 | |
#error | 当遇到标准错误时,输出错误消息 | |
#pragma | 使用标准化方法,向编译器发布特殊的命令到编译器中 | ? |
常见宏:
- DATE
当前日期,一个以 “MMM DD YYYY” 格式表示的字符常量 - TIME
当前时间,一个以 “HH:MM:SS” 格式表示的字符常量。 - FILE
这会包含当前文件名,一个字符串常量。 - LINE
这会包含当前行号,一个十进制常量。 - STDC
当编译器以 ANSI 标准编译时,则定义为 1。
- 函数
返回值 函数名(参数...){
//函数语句
}
int test(int a){
printf("测试数据%s \n",a);
}
- 变量 变量其实只不过是程序可操作的存储区的名称。C 中每个变量都有特定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上。 变量的名称可以由字母、数字和下划线字符组成。它必须以字母或下划线开头。大写字母和小写字母是不同的,因为 C 是大小写敏感的.
//格式
type variable_list;
int a;
extern int b; //
- 语句 & 表达式
- 左值 指向内存位置的表达式被称为左值(lvalue)表达式。左值可以出现在赋值号的左边或右边。如变量就是左值。
- 右值 术语右值(rvalue)指的是存储在内存中某些地址的数值。右值是不能对其进行赋值的表达式,也就是说,右值可以出现在赋值号的右边,但不能出现在赋值号的左边。如数值”10″就是右值,只能出现赋值号的右边。
- 注释
注释有三种方式
单行注释
// 这是单行注释
多行或单行注释
/* 注释 */
/*
多行注释
多行注释
*/
多行文本注释
/**
* 多行注释
* 多行注释
*/
- 位运算符 假设A、B的二进制数为: A = 0011 1100 B = 0000 1101
运算符 | 描述 | 案例 |
---|---|---|
&(与操作) | 运算规则 0&0=0; 0&1=0; 1&0=0; 1&1=1; | (A & B) 将得到 12,即为 0000 1100 |
|(或操作) | 运算规则 0|0=0; 0|1=1; 1|0=1; 1|1=1; | (A | B) 将得到 61,即为 0011 1101 |
^(异或操作) | 运算规则 0^0=0; 0^1=1; 1^0=1; 1^1=0; | (A ^ B) 将得到 49,即为 0011 0001 |
~(取反操作) | 运算规则 ~0=1; ~1=0; | (~A ) 将得到 -61,即为 1100 0011,一个有符号二进制数的补码形式。 |
<<(左移位运算) | 将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0) | A << 2 将得到 240,即为 1111 0000 |
>>(右移位运算) | 将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。 | A >> 2 将得到 15,即为 0000 1111 |
执行结构
- 顺序结构
按代码顺序执行 - 选择结构
按条件匹配执行,如if…else…或swtich(param) - 循环结构 循环执行同一代码段,如while()、for()、do…while()