关键字
-
C语言中标准定义的关键字共32个。
-
auto:缺省时编译器一般默认为auto;
-
int,double,long,char,float,short,
-
signed-有符号型类型变量;unsigned-无符号类型变量;
-
struct-声明结构体变量;union-声明联合体变量;enum-枚举;static-静态变量;
-
switch-开关变量-case-开关语句分支-default-开关语句-其他分支 break-跳出当前循环;register-声明寄存器变量;
-
const-常量; volatile-说明变量在程序中可以被隐含地改变;
-
typedef 给数据类型取别名;extern 声明变量在其他文件中声明-引用变量;
-
return ,void, continue ,do ,* while* ,if…else… ,for ,goto ,
-
sizeof:计算对象所占内存空间大小;
-
定义 :编译器创建一个对象,为此对象分配一块内存并取上一个名字,此名字即变量名/对象名;一旦此名字与内存匹配起来,则同生共死,此内存位置不能被改变,并且在作用域区间只能被定义一次
-
声明 :1、告诉编译器已经匹配到一块内存上,下边所用到的变量或对象是在被的地方定义的,声明可以出现多次;2 、告诉编译器此名字已经被预定,别的地方不可用
static
- 1、修饰变量。
静态全局变量,作用域仅限于变量被定义的文件中,其他文件即使使用extern声明也没办法使用。准确的说是:作用域是从定义之处开始,到文件结尾处结束,在定义之处前面的那些代码行也不能使用,要想使用需要添加extern,想要使用的话,把他定义在文件顶端就可以了。
静态局部变量,在函数体里面定义的就只能在这个函数里面应用,同一个文档里面的其他函数也用不了。由于被static修饰的变量总是存在内存的静态区,所以即使这个函数运行结束这个静态变量的值也不会被销毁,函数下次使用时依然可以用到这个值。
static int j;
void fun1(void)
{
static int i = 0;
i++
}
void fun2(void)
{
j = 0;
j++;
}
int main()
{
int k = 0;
for(k = 0;k < 10;k++)
{
fun1();
fun2();
}
return 0;
}
- 2、修饰函数
在函数钱添加static 使得函数成为静态函数。此处的“static”的含义不是指存储方式,而是指对函数的作用域仅限于本文件(所以又称为内部函数)。使用内部函数的好处是:不同的人编写不同函数时,不用担心自己定义的函数是否会与其他文件中的函数同名。
变量命名规则
- 一般规则
规则1-1 命名应当直观并且可拼读,可望文知意,便于记忆和阅读;最好使用英文单词及其组合,不要太过复杂
规则1-2 命名的长度应当符合“min-length&&max-information”原则。命名应当简捷英文单词精良不要缩写,特别时非常用专业名词;如果有缩写,在同一系统内对同一单词必须使用相同方法,并且注明其意思;
规则1-3 当标识符由多个词组成时每个词的第一个字母大写,其余小写;
规则1-4 尽量避免名字中出现数字编号,除非逻辑上有必要,比如引脚命名非编号名字反而不好;
规则1-5 对多个文件之间共同使用的全局变量或函数要加范围限定符(建议使用模块名(缩写)作为范围限定符)比如GUI_等。 - 标识符的命名规则
规则1-6 标识符名分为两部分:规范标识符前缀(后缀)+含义标识。非全局变量可以不使用范围限定符前缀
规则1-9 含义标识命名规则,变量命名使用名词性词组,函数命名使用动词性词组, -
- 变量含义标识符构成:目标词+动词(过去分词)+[状语]+[目的地]
-
- 函数含义标识符构成:动词(一般现在时)+目标词+[状语]+[目的地]
规则1-10 程序中不得出现仅靠大小写区分的相似的标识符;
规则1-11 一个函数名禁止被用于其他之处。
规则1-12 所有宏定义、枚举常量、只读变量全部用大写字母命名,用下划线分割单词;
规则1-13 考虑到习惯性问题,局部变量中科采用通用的命名方式,但仅限于n,i,j等作为循环变量使用
一般来说习惯使用n,m,i,j,k等表示int类型变量;c,ch等表示字符类型变量,a表示数组;p表示指针;其他字符尽量不要使用;
规则1-14 结构体被定义时必须有明确的结构体名;
- 函数含义标识符构成:动词(一般现在时)+目标词+[状语]+[目的地]
sizeof是关键字而不是函数
- signed、unsigned 关键字
负数的存储表示:
把基本数据类型的最高位腾出来,用来存储符号,同时约定如下:最高位如果是1,表明这个数是负数,其值为除最高位以外的剩余位的值添加上一个负号;如果最高位是0,表明这个数是在正数,其值为除最高位以外的剩余位的值。
32位的signed int类型整数,其值表示范围为:-231 ~(231-1);
8位的char类型数,其值表示范围为:-27~(27-1);
32位的unsigned int类型整数,其值表示范围为:0 ~(232-1);
8位的char类型数,其值表示范围为:0~(28-1);
int main()
{
signed char a[1000];
int i;
for(i = 0;i < 1000;i++)
{
a[i] = -1 - i;
}
printf("%d",strlen(a));
return 0;
}
- 它的答案是255
在计算机系统中,数值采用补码表示(存储)。主要原因是因为使用补码可以将符号和其他位进行统一管理,同时,减法也可以按照加法处理;另外两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。正数的补码与其原码一致;负数的补码,符号位为1,其余位为该数绝对值的原码,按位取反然后整个数加1.
按照负数补码的规则,可以知道-1的补码为0xff,-2的补码为0xfe。。。;当i的值为127时,a[127]的值为-128,而-128是char类型数据能表示的最小的负数。当i继续增加,a[128]的值肯定不是-129;因为这时侯发生了溢出,-129需要9位才能存储,而char只有8位,所以最高位被丢弃,剩的8位算是原来9位补码的低8位的值即0x7f。当i继续增加大到255的时候,-256的补码的低8位为0;然后当i增加到256时,-257的低8位全为1,即低8位的补码为0xff,如此依次循环下去。。。
按照上述分析,a[0]~a[254]里面的值都不为0,而a[255]的值为0.
strlen函数时计算字符串长度的,并不包含字符串最后的‘\0’;如果遇到’\0’,则认为本字符串结束。
if else组合
-
bool变量与“零值”进行比较
bool bTestFlag = FALSE; -
if(bTestFlag ); if( !bTestFlag);
if语句是靠其后边紧跟的括号里面的表达式的值来进行分支跳转;本组写法可以在较大程度上规避了误会也不会因为TRUE和FLASE不同定义值出错。—这种写法是最好的。 -
float变量与零值进行比较
规则1-20使用浮点数应遵循已定义好的浮点数标准;
标准c无具体定义
ANSI/IEEE标准规定如下所述
(1)两种基本浮点格式:单精度和双精度
(2)两种扩展浮点格式:单精度扩展和双精度扩展
(3)浮点运算的准确度要求:加、减、乘、除、平方根、余数、将浮点格式的数舍入为整数值、在不同浮点格式之间转换、在浮点数和证书格式之间转换以及比较;
(4)在十进制字符串和两种基本浮点格式之一的二进制浮点数之家进行转换的准确度、单一性和一致性要求;
(5)物种类型的IEEE浮点一场,以及用于向用户指示发生这些类型一场的条件。
五种类型的浮点异常是:无效运算、被零除、上溢、下溢和不精确。
(6)四种射入方向
向最接近的克表示的值
当前有两个最接近的课表示的值时,首选“偶数”值;
向负无穷大(向下)
向正无穷大(向上)以及向0(截断); -
if(NULL == p); if(NULL != p);
虽然样子古怪;这样写可以避免少写一个=符号,此种写法是可以被编译器识别的。 -
else始终与同一括号内最近的未匹配的if语句结合。
另外符号{}建议遵循以下规则
建议1-21 程序中的分界符{}对齐风格如下表所示:
其中表格的缩进一般为4个字符,但不要使用Tab键盘,因为不同的编辑器Tab键定义的空格数量不一样,别的编辑器打开Tab键缩进的代码可能会出现混乱
- if与空语句连用
if(NULL != p)
{
NULL;
}
- 所有if-else if结构应该由else子句结束
switch、case组合
- 每个case语句结尾处要加break,否则会导致多个分支重叠。
- 最后必须使用default分支。且default子句只用于检查真正的默认情况。
- switch、case组合中,禁止使用return语句。
- case后面只能是整型或字符型常量或常量表达式。
do、while、for关键字
- C语言中循环语句有三种:while循环、do-while循环和for循环。
- break和continue的区别
-
- break表示终止本层循环。continue表示终止本次循环,进入下一次循环。
循环语句 使用注意
- 多重循环时,若有可能,将最长的循环放在最内层,最短循环放在最外层,减少循环层的次数
- for语句的循环控制变量的取值采用“半开半闭区间”写法。
void
- void修饰函数返回值和参数
- 若函数无返回值,应将其声明为void类型。
- 若函数无参数,应将其参数声明为void类型。
- void指针
- 若函数的参数为任意类型指针,则应声明其参数为void*。
- 不能对void指针进行算法操作。
return关键字
- return用来终止一个函数并返回其后面跟着的值。
- return语句不可返回指向“栈内存”的指针,因为该内存在函数体结束时被自动销毁。
const关键字
- const只读变量具有不可变性。
- 修饰一般变量时,修饰符const可在类型说明符前,也可以用在类型说明符之后。例:int const i = 2; 或 const int i = 2;
- 修饰指针
- const int *p; //p可变,p指向的对象不可变
- int const *p; //p可变,p指向的对象不可变
- int * const p; //p不可变,p指向的对象可变
- const int *const p; //指针p和p指向的对象都不可变
- const修饰函数的参数
void Fun (const int *p); - const修饰函数返回值
const int Fun(void);