循环各种循环格式
for(判断条件0或1){}
else{}
while(判断条件){
}
switch(表达式){
case 值1:语句1
break;
case 值2:语句2
break;
...
default:语句n
break;
}
C
语言提供了可随意滥用的goto
语句以及标记跳转位置的标号。
从理论上讲,goto语句是没有必要的,实践中不使用goto
语句也可以很容易地写出代码。
但是它还是有的一定作用的
例如一次跳出两层或多层循环。
for ( ... ){
for ( ... ) {
...
if(disaster){
goto error;
}
}
}...
error:
解释是关于c的基本运算符
双等于号==是C语言中表示“等于”关系的运算符
即使这样误用了,
其结果通常仍然是合法的表达式, 因此系统不会给出警告信息。
单引号中的字符表示一个整型值,
该值等于此字符在机器字符集中对应的数值, 我们称
之为字符常量。 但是, 它只不过是小的整型数的另一种写法而已。例如,'A'是一个字符常量;
在ASCII字符集中其值为65(即字符A的内部表示值为65)。
当然,用'A'要比用65好,
因
为。'A'的意义更清楚,
且与特定的字符集无关。
||
&&相应地, 运算符&&代表AND(逻辑与),
它仅比||高一个优先级。
由&&或||连接的表达式由左至右求值,
并保证在求值过程中只要能够判断最终的结果为真或
假, 求值就立即终止。
任何变量的声明都可以使用const
限定符限定。该限定符指定变量的值不能被修改。
对数组而言,const限定符指定数组所有元素的值都不能被修改:
如果试图修改const
限定符限定的值,其结果取决于具体的实现。
接着介绍就是数据存放的东西--数组 /枚举/结构体
字符串常量就是字符数组
字符串的内部表示使用一个空字符'\0'作为串的结尾,因此
存储字符串的物理存储单元数比括在双引号中的字符数多一个。
标准库函数 strlen(s)可以返回字符串参数s
的长度,但长度不包括末尾的'\0'。
我们应该搞清楚字符常量与仅包含一个字符的字符串之间的区别:'x'与"x"是不同的。前者是一个整数,其值是字母x
在机器字符集中对应的数值(内部表示值);后者是一个包含一个字符(即字母x)以及一个结束符'\0'的字符数组。
枚举常量是另外一种类型的常量。枚举是一个常量整型值的列表,例如:
enum boolean { NO, YES };
同一枚举中不同的名字可以具有相同的值。
在没有显式说明的情况下,enum类型中第一个枚举名的值为0,第二个为1,依此类推。
关键字
struct 引入结构声明。
结构声明由包含在花括号内的一系列声明组成。关键字struct
后面的名字是可选的,称为结构标记。
结构标记用于为结构命名,在定义之后,结构标记就代表花括号内的声明,可以用它作为该声明的简写形式。
例子:
struct point {
int x;
int y;};
在表达式中,可以通过下列形式引用某个特定结构中的成员:
结构名.成员
printf("%d,%d", pt.x, pt.y);
结构体和数组一样都是构造型数据类型,和数组不同的是,结构体可以处理不同类型的数据。如下定义一个学生信息的结构体:
struct student{
int number;
char sex[3];
char name[10];
srtuct birthday birth;//birthday
是结构体类型的数据,这里没有写出来
char dep[20];
}这个结构体有三种类型的数据,可以看出结构体里还可以有结构体类型、共用体的类型的数据。
共用体是一种多变量共享存储空间的构造类型,它允许几种不同的变量共用同一存储空间。共用体和结构体的区别:
1.结构体每一位成员都用来表示一种具体事务的属性,共用体成员可以表示多种属性(同一存储空间可以存储不同类型的数据)。
2.结构体总空间大小,等于各成员总长度,共用体空间等于最大成员占据的空间。
3.共用体不能赋初值。
只要理解了共用体了结构体他们的区别应该能分清楚。
枚举类型是指变量的值可以全部列出,定义一个枚举变量后,变量的值确定在定义之中。
它和结构体、共用体的区别在于,枚举元素是常量,只能在定义阶段赋值。
枚举是比较特别的类型,有很多的细节,你可以翻阅书本继续理解。
函数
在C语言中,
所有函数参数都是“通过值” 传递的。
在C语言中,
被调用函数不能直接修改主调函数中变量的值,
而只能修改其私有的临时副本的值。但可以通过日后介绍的指针所搞定
外部变量与作用域
extern是全局变量声明
例如 #include "my_Fun.c"
extern int b;//b是在my_Fun.c中声明了的一个全局变量
外部变量必须定义在所有函数之外,且只能定义一次,定义后编译程序将为它分配存储单元。
在通常的做法中,所有外部变量的定义都放在源文件的开始处,这样就可以省略extern声明。
人们通常把变量和函数的extern声明放在一个单独的文件中(习惯上称之为头文件),
并在每个源文件的开头使用#include语句把所要用的头文件包含进来。
后缀名.h约定为头文件名的扩展名。
ANSI C语言中的全部转义字符序列如下所示:
\a响铃符\b回退符\f换页符\n换行符
\r 回车符
\t 横向制表符\v纵向制表符
\\反斜杠\?问号\'单引号\"双引号\ooo八进制数\xhh十六进制数
+、-、*、/、%
表达式
x%y
的结果是x
除以y
的余数,当x
能被y
整除时,其值为0。
按位运算符
register
声明告诉编译器,它所声明的变量在程序中使用频率较高。
register:这个关键字请求编译器尽可能的将变量存在CPU内部寄存器中,而不是通过内存寻址访问,以提高效率。
注意是尽可能,不是绝对。
其思想是,将register变量放在机器的寄存器中,这样可以使程序更小、执行速度更快。
但编译器可以忽略此选项。
register int x;
接着就是c语言中的预处理:
还可以使用条件语句对预处理本身进行控制,这种条件语句的值是在预处理执行的过程中进行计算。这种方式为在编译过程中根据计算所得的条件值选择性地包含不同代码提供了一种手段。
#if 语句对其中的常量整型表达式(其中不能包含sizeof、类型转换运算符或enum
常量)进行求值,若该表达式的值不等于0,则包含其后的各行,直到遇到#endif、#elif或#else语句为止(预处理器语句#elif类似于else
if)。在#if语句中可以使用表达式defined(名字),该表达式的值遵循下列规则:当名字已经定义时,其值为1;否则,其值为0。
#if !defined(HDR)
#define HDR
/* hdr.h 文件的内容放在这里*/#endif
C
语言专门定义了两个预处理语句#ifdef与#ifndef,它们用来测试某个名字是否已经定义。上面有关#if的第一个例子可以改写为下列形式:
#ifndef HDR
#define EDR
/* hdr.h 文件的内容放在这里*/#endif
宏定义的形式如下:
#define 名字替换文本
#define指令可以把符号名(或称为符号常量) 定义为一个特定的字符串: