goto语句
goto语句是一个分支语句,有类似循环的作用。作用是跳转到标号的语句位置
c语言提供了可以乱用的 go to语句和标记跳转的符号。
从理论上讲go to语句是没必要的,但在某些场合用得着,最常见就是终止程序在某些深度嵌套的结构的处理过程。
用法
标号:
goto 标号 ;作用 跳转代码至标记号的位置再运行 举例:
int main() { again://标记跳转的标号 printf("哈哈\n"); printf("哈哈\n"); printf("嘻嘻\n"); printf("嘿嘿\n"); printf("呜呜 \n"); goto again;//跳到again的位置去 这里就是一个死循环 }
缺点 多次使用会导致你的程序不知道如何运行 没有条理 ,尽量不要使用
一般只适用于终止程序在某些深度嵌套的结构的处理过程。举例:
for (...) { for (...) { for (...) { for (...) { if (disaster) { goto error; } } } } } error; if (diaster) { //处理错误 } //这里想要处理错误,但是要想跳出循环,只用break只能跳出一个循环,这里用goto语句就可以直接跳出来。
在这里,我们写一个关机程序来运用goto语句,类似循环的作用。
//程序运行起来,倒计时60s后关机,输入我是猪,取消关机。 int main() { char arr[20] = { 0 }; system("shutdown -s -t 60"); again; printf("请注意你的电脑一分钟后关机,如果输入:我是猪,则取消关机"); scanf("%s", arr); if (strcmp(arr, "我是猪") == 0) { system("shutdown -a"); print("已取消关机") } else { goto again; printf("输入错误\n"); } return 0; }
只有当你正确输入才停止关机,否则一直输入等至60s后关机。
函数
函数是什么
.在计算机科学中,函数时一个大型程序中的某些代码,有一个或多个语句模块组成。它负责完成某项特定任务,而相较于其他代码具有相对的独立性
.一般函数由输入参数与返回值,提供对过程的封装和细节的隐藏。
函数的分类
.库函数,自定义函数
库函数可以理解为 那些频繁大量需要使用的函数被人们写出来后放在一个库 使用时 调用时申明一下库便可以直接使用 库函数里的函数更加标准。
自定义函数就是库函数中无法提供的函数,我们自己需要自己定义实现某项功能的函数来使用 所有的函数都可以自己来定义。
库函数的学习可在msdn cpluplus cpprefoerence 的网站或应用上学习。
重点说下自定义函数。
函数是有 函数名 函数类型 函数参数 以及实现函数的语句 ,在自定义函数里这些都是我们自己设计的。
其中设计函数时,还需要注意函数如何使用,关于其返回值,参数是如何设计的。
举一个简单的例子
int Get_max(int x, int y)//一个找出两个数中较大的函数 { if (x > y) { return x; } else { return y; } } int main() { int a = 0; int b = 0; scanf("%d %d", &a, &b); int m = Get_max(a, b); printf("%d", m); return 0; }
在这里设计一个函数, 找两个数中的较大值 , 因为是两个数,故函数参数为两个整形传进来,因为找的是较大的一个,函数需要返回一个整形的值,故函数类型为整形。
使用函数时 因为函数的返回值时一个整形,我们需要在创建一个整形的值来接收这个整形,传参数即为两个需要比较的数。
函数定义时,不返回的为void型 无符号类型的unsigned +类型 size_t表示无符号类型的空间大小
一般该函数需要改变实参的值时,则函数传参是对应参数的地址,需要传指针
下面详细介绍
函数的参数
.参数(实参)int m = Get_max(a, b);
真实传给函数的参数,叫实参 ,例如a,b
实参可以是:常量,变量,表达式,函数等
无论是何种类型的参数,在进行调用时,他们都必须有确定的值,一般把这些值传给形参。
.形参int Get_max(int x, int y)
//形式参数是指函数后面括号的变量,因为形式参数只有在函数被调用的过程才实例化(分配内存单元),所以叫形式参数,形式参数当函数调用完成后自动销毁,只在函数中有效。如这里的 x,y.
函数调用
.传值调用
函数的形参和实参分别找有不同的扽村快,对形参的改变不影响实参
.传址调用
传址调用时把函数外部船舰的变量的内存地址传给函数的参数的方式
这种传参可以让参数和函数外边的变量建立真正的联系,也就是函数可以直接操作外部的变量
void swap1(int x, int y) { int tmp = 0; tmp = x; x = y; y = tmp;//在这里函数确实把a,b两变量换了,但这是形参与外部实参没有关系,外部实参任然未改变 } int main() { int a = 0; int b = 0; scanf("%d %d", &a, &b); printf("交换前:a=%d,b=%d", a, b); swap1(a,b); printf("交换后:a=%d,b=%d", a, b); return 0; }
本例子为一个错误示范,函数的作用是想去交换传进来的数的值
这里传参采用的便是值传递,值传递不改变外部变量的值。
地址未发生改变。
void swap2(int *a, int *b) { int tmp = 0; tmp = *a; *a = *b; *b = tmp; } int main() { int a = 0; int b = 0; scanf("%d %d", &a, &b); printf("交换前:a=%d,b=%d", a, b); swap2(&a, &b); printf("交换后:a=%d,b=%d", a, b); return 0; }
这里的函数可以实现乞丐变量个数的功能。
函数要改变外部变量的值,则需要址传递,传递地址便可修改外部变量的值(若实参为指针,则形参就是二级指针)。