分支语句
分支语句的执行是依据一定的条件选择执行路径,而不是严格按照语句出现的顺序
if_else
对于if语句来说他有三种可能判断的情况
这三种情况 在if与if语句进行嵌套时,他else和最近的if结合。
布尔变量与零值比较
不可以将布尔变量直接与TUER,FALSE或者1,0进行比较。例如
if (flag) // 表示 flag 为真
if (!flag) // 表示 flag 为假
但是下面的用法是不正确的
if (flag == TRUE)
if (flag == 1 )
if (flag == FALSE)
if (flag == 0)
整形变量与零值比较
应当将整型变量用“==”或“!=”直接与 0 比较。
浮点变量和零值比较
不可将浮点变量用“==”或“!=”与任何数字比较。 应该设法转化成“>=”或“<=”形式。
指针变量与零值比较
应当将指针变量用“==”或“!=”与 NULL 比较。
switch多分支结构
对于switch语句,他是一种选择结构的语句,它可以用来代替拥有多个分支的 if else 语句。
switch(整形变量表达式)//它里面只能判断整形
{
case 常量1:语句块1;break;
case 常量2:语句块2;break;
case 常量3:语句块3;break;
case 常量4:语句块4;break;
.......
case 常量n:语句块n;break;
default:语句;break;
}
C语言的一些基本规则
注释
当代码过长时,尤其是有多重嵌套,应在一些段落的结束处加注释。
类的版式:
(1)private 类型的数据写在前面,而将 public 类型的函数写在后面, 采用这种版式的程序员主张类的设计“以数据为中心”,重点关注类的内部结构。
(2)将 public 类型的函数写在前面,而将 private 类型的数据写在后面,采用这种版式的程序员主张类的设计“以行为为中心”,重点关注的是类应该提供什么样 的接口(或服务)。
命名规则:
全局函数:动词/动词加名词
类的成员函数:动词
避免名字中出现数字编号
类名和函数名用大写字母开头的单词组合而成
静态变量加前缀 s_
如果不得已需要全局变量,则使全局变量加前缀 g_
类的数据成员加前缀 m_
为了防止某一软件库中的一些标识符和其它软件库中的冲突,可以为各种标识符加上能反映软件性质的前缀。例如三维图形标准
OpenGL 的所有库函数 均以 gl 开头,所有常量(或宏定义)均以 GL 开头。
二进制有四种操作(位运算)
//&(与)
//|(或)
//^(双目运算)异或
//~(单目运算)位反
引用
引用必须先初始化,没有空引用,引用不能二级引用
字符与字符串
字符串由一个或多个字符组成 //
字符串都是隐藏了一个结束符,‘\0’
scanf_s
输入语句是将键盘输入的内容放入地址里面去。
","的用法
“,”的优先级最低,x=(a+b,b+2,c+3),最后输出c+3;
三种循环
for( ; 表达式2; )
while()
{
}
do
{
}while
死循环
for( ; 表达式2; )
若没有表达式2循环就会成为死循环
while语句的死循环
while(1);
dowhile语句的死循环
do
{
}while(1);
汇编:
mov
他是传送数据的指令
eax
EAX寄存器:累加器,在乘法和除法指令中被自动调用;在win32中,一般用在函数的返回值中。
ebx
他是"基地址"(base)寄存器, 在内存寻址时存放基地址。
ecx
他是计数器(counter), 是重复(REP)前缀指令和LOOP指令的内定计数器。
edx
edx总是被用来放整数除法产生的余数。
esi/edi
分别叫做"源/目标索引寄存器,因为在很多字符串操作指令中, DS:ESI指向源串,而ES:EDI指向目标串.
ESP
栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。
EBP
基址指针寄存器(extended base pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。
eip
EIP寄存器,用来存储CPU要读取指令的地址,CPU通过EIP寄存器读取即将要执行的指令。每次CPU执行完相应的汇编指令之后,EIP寄存器的值就会增加。
push
为栈增加一个元素 ,把字压入堆栈.
pop
从栈中取出一个元素 ,把字弹出堆栈.
add:加法.
inc:加 1
div:无符号除法.
mul:无符号乘法.
sub:减法
call:过程调用
CPU执行call指令时,进行2步操作:
- 将当前的IP或CS和IP压入栈中
- 转移
ret:用栈中的数据,修改IP的内容,从而实现近转移;
mov ebx,10h:
mov[ebx],10h:
ret
返回。相当于跳转回调用函数的地方。(对应的call指令来调用函数,返回到call之后的下一条指令。)
JMP
功能: 跳往指定地址执行 语法: JMP 地址
跳转语句:
break;每次跳出一层循环
continue:只结束本次循环
goto:标号(字符后加“:”)只能在本函数内跳转
return:退出函数
exit:include<stdlib.h>,在函数中当前进程被杀死,在主函数中和return一样
数组
对于数组用之前要进行初始化,
数组由元素的类型和元素的数量组成的(组合类型)
数组的定义:int ar[常量];
内存中连续存放:
查表法:用for循环来逐一打印
在输出语句中(%08d)宽度为八,不够用零补。
返回值的规则
(1),不要省略返回值的类型,在c语言中,凡不加类型说明的函数,一律自动按整型处理 .
(2)函数名字与返回值类型在语义上不可冲突。 例如C语言标准库函数的getchar.
char c;
c = getchar();
if (c == EOF)
…
按照 getchar 名字的意思,将变量 c 声明为 char 类型是很自然的事情。但不幸的是 getchar 的确不是 char 类型,而是 int 类型,其原型如下: int getchar(void);
(3).不要将正常值(读取正确的值)和错误标志(getchar 读取的值错误类型或者结束的时候,它会返回一个标志,这个标志就是错误标志)混在一起返回。正常值用输出参数获得,而 错误标志用 return 语句返回。
getchar函数读取的是字符型,它会将其转化为ascall值的形式存储在内存中。