什么是语句?
c中由一个;隔开的就是一条语句
分支语句(选择结构)
if else
如果书写不规范,则else会与最近的可以匹配的if匹配
写判断条件时,(4num)比(num4)更好,更易检查出问题
switch
break语句的实际效果是把语句列表划分为不同的部分。(最后记得加上break)(跳出当前{})
switch(整型表达式) case 整型常量表达式 也可以是char
如果与case都不匹配,则执行default语句(最好加上)
循环语句
while循环
continue会跳出本次循环,跳到下次循环的判断
break会永久跳出循环
EOF——end of file (文件结束的标志)(本质上是-1)
scanf getchar()等输入函数并不是从键盘直接读入数据的 而是从输入缓冲区读入 如果输入123\n 则\n不会被scanf读走,为了处理缓冲区多余的 字符,可以添加一个循环:
while(getchar()!=’\n’){
;
}
死循环:while(1)
for循环(使用最多)
先执行初始化部分,然后循环判断部分,之后执行循环体内语句,最后执行调整语句
最好不要在for 循环体内修改循环变量,防止 for 循环失去控制。
建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
死循环:for(;;)
//请问循环要循环多少次?
#include
int main() {
int i = 0;
int k = 0;
for(i =0,k=0; k=0; i++,k++)
k++;
return 0; }
一次都不执行,判断条件k=0为假,故不进入循环
do while循环
先执行循环语句,再执行判断条件
goto语句
会让代码执行逻辑变得混乱
最常见的用法就是终止程序在某些深度嵌套的结构的处理过程,例如一次跳出两层或多层循环。这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。
函数
完成某一项特定的任务,相对于其他代码具有一定独立性,提供过程的封装和细节的隐藏,一般有参数和返回值
库函数、自定义函数
函数不能嵌套定义,可以嵌套调用
return会直接跳出函数 并返回值(只能返回一个值)
printf函数的返回值是打印的字符的个数(发生错误时返回一个负数)
库函数
使用时必须包含#include对应的头文件
常用的库函数:IO函数、字符串操作函数、字符操作函数、内存操作函数、时间/日期函数、数学函数、其他库函数
学习网站: http://www.cplusplus.com/ http://en.cppreference.com/
自定义函数
void表示这个函数不返回任何值 return只能返回一个值
对形参的改变并不会影响实参,所以在设计交换两个数的函数时需要利用指针(传递那两个数的地址)(在函数内部想改变函数外部的数据)
传值调用:函数的形参和实参分别占有不同的内存块,对形参的修改不会影响实参
传址调用:把函数外部创建变量的内存地址传递给函数参数(使用指针),可以让函数与其外边的变量建立起真正的联系,即在函数内部可以直接操作函数外部的变量
数组在传参时,传递的是数组首元素的地址 如想计算数组中元素个数 应在函数外计算完再传入函数中
函数的嵌套调用和链式访问
函数可以嵌套调用,不能嵌套定义(没有这种说法)
链式访问:把一个函数的返回值作为另外一个函数的参数。
函数的声明和定义
函数要先声明后使用
函数声明一般在头文件中 函数定义另外创建一个.c文件,构成一个模块 使用时直接引用头文件即可使用
可以使用: #ifndef TEST_H
#define TEST_H
来避免头文件重复引用
函数递归
函数自己调用自己
通常把一个大型问题层层简化为一个相似的规模较小的问题来求解 用少量的程序描述出需要的多次重复计算 大事化小
接收一个整型值(无符号),打印它的每一位(如1234–>1 2 3 4):
include <stdio.h>
void print(int n)
{
if(n>9)//递归限制条件
{
print(n/10);//层层拆解 把数字按位拆分
}
printf("%d ", n%10);
}
int main()
{
int num = 1234;
print(num);
return 0;
}
满足递归限制条件后就跳出递归 每次递归后要越来越接近限制条件
每次函数调用都会调用内存空间 使用递归时可能导致栈溢出的错误
编写函数不允许创建临时变量,求字符串的长度:
#incude <stdio.h>
int Strlen(const char*str)
{
if(*str == '\0')
return 0;
else
return 1+Strlen(str+1);
}
int main()
{
char *p = "abcdef";
int len = Strlen(p);
printf("%d\n", len);
return 0;
}
而递归时很多计算重复,导致效率低下,这时需要把递归转变为非递归
汉诺塔问题 青蛙跳台问题