关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

C语言中的goto语句和函数(上)

发布时间:2023-06-27 20:00:29

学习目标:


  • 掌握 C 入门知识
  • 学习自律+1 +1 +1 +1…+1

学习内容:


1.goto语句

2.函数:(1) 函数的参数(2) 函数的调用

一.goto语句


goto语句:终止程序在某些深度嵌套的结构的处理过程(可以跳转)

1.代码示例:


#includeint main() {  again:  printf("hello\n");  printf("hello\n");  printf("hihi\n");  goto again;  return 0; }

   

2.用goto语句实现一个关机程序


程序运行起来后,倒计时60秒关机,如果输入好好学习就可以取消关机。

使用命令行关机


shutdown -s -t 关机

shutdown -a 取消关机

#include#include#includeint main() {  char arr[20] = { 0 };  system("shutdown - s - t 60"); again:  printf("请注意,你的电脑将在一分钟内关机,如果输入:好好学习,就取消关机\n");  scanf("%s", arr);  if (strcmp(arr, "好好学习")==0)  {  system("shutdown - a");  }  else  {  goto again;  }  return 0; }

   

所以可以写成strcmp(arr, “好好学习”) == 0

二.掌握函数基本语法


1.函数是什么


(1).函数就是 C 语言的模块,一块一块的,有较强的独立性,可以相互调用,换句话说,C 语言中,一个函数里面可以调用 n 个函数,即大函数调用小函数,小函数又调用“小小”函数。这就是结构化程序设计,所以面向过程的语言又叫结构化语言。

(2).函数就是一系列 C 语句的集合,能完成某个特定的功能。需要该功能的时候直接调用该函数即可,不用每次都堆叠代码。需要修改该功能时,也只需要修改和维护这一个函数即可。

2. 函数的分类


(1).库函数:库函数(Library function)是把函数放到库里,供别人使用的一种方式。一般是指编译器提供的可在c源程序中调用的函数。可分为两类,一类是c语言标准规定的库函数,一类是编译器特定的库函数。

(2).自定义函数:自定义函数是程序员自己声明和定义的,是程序员补充的工具,不管是现成工具的还是补充的工具,都是工具,对使用者来说都一样,没有区别。在C语言中,函数的调用非常灵活,可以独占一行语句,也可以当成常量赋值给变量,也可以当成函数的参数。

3.库函数


(1)strcpy函数:C 库函数char *strcpy(char *dest, const char *src) 把src 所指向的字符串复制到dest(\0也可以拷贝)。 需要注意的是如果目标数组dest 不够大,而源字符串的长度又太长,可能会造成缓冲溢出的情况。

 #include#include#includeint main() {  char str1[] = "Sample string";  char str2[40];  char str3[40];  strcpy(str2, str1);  strcpy(str3, "copy successful");  printf("str1:%s\nstr2:%s\nstr3:%s\n", str1, str2, str3);  return 0; }

   

(2)memset函数:memset 函数是内存赋值函数,用来给某一块内存空间进行赋值的。 其原型是:void memset(void _Dst, int _Val, size_t _Size)

_Dst是目标起始地址,_Val是要赋的值,_Size是要赋值的字节数。

#include#includeint main() {  char str[] = "hello world";  memset(str, 'x', 5);  printf("%s\n", str);  return 0; }

   

4.自定义函数(有函数名 返回值类型和函数参数)


(1).找出两个整数之间的最大值

#includeint 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\n", m);  return 0; }

   

并不是说函数都有返回,有的不用返回可以写成void get_max()

以上get_max就是一个自定义函数

5.函数的参数


(1).函数的实参:

函数被调用时给出的参数包含了实实在在的数据,会被函数内部的代码使用,所以称为实际参数,简称实参。

实参可以是变量 常量 表达式 函数等

#includeget_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);//变量  //int m = get_max(a, 3);//常量  //int m = get_max(a, 2+3);//表达式  int m = get_max(a, get_max(4, 5));//函数  printf("%d\n", m);  return 0; }

   

(2).函数的形参:

在函数定义中出现的参数可以看做是一个占位符,它没有数据,只能等到函数被调用时接收传递进来的数据,所以称为形式参数,简称形参。

形式参数当函数调用完之后就自动销毁了

(3):示例:写一个函数可以交换两个整形的变量内容

由图片可知,最后a和b的值并没有交换,这是为什么呢?

a,b是实参;x,y是形参形参是实参的一份临时拷贝,对形参的修改是不会影响实参的

通过调试可以知道,当a,b传参过去给x,y但是x,y的地址和a,b并不相同,所以交换后交换的只是x,y的值对a,b并无影响

所以可以采用指针的方式


6. 函数的调用


(1).传值调用:

传值调用: 函数的形参和实参分别占有不同的内存块,对形参的修改不会影响实参

#includevoid Swap1(int x, int y) {  int tmp = x;  x = y;  y = tmp; } int main() {  int a = 0;  int b = 0;  scanf("%d %d", &a, &b);  printf("交换前:a=%d,b=%d\n", a, b);  Swap1(a, b);  printf("交换后:a=%d,b=%d\n", a, b);  return 0; }

   

(2).传址调用:

将实参的地址传递给函数,在函数内对形参进行操作等同于对实参进行相同的操作,在函数调用结束返回后,形参被释放,实参的内容是对形参进行操作后的结果。

#includevoid Swap2(int* pa, int* pb) {  int tmp = *pa;  *pa = *pb;  *pb = tmp; } int main() {  int a = 0;  int b = 0;  scanf("%d %d", &a, &b);  printf("交换前:a=%d,b=%d\n", a, b);  Swap2(&a, &b);  printf("交换后:a=%d,b=%d\n", a, b);  return 0; }

   

(3).注意

下图这种方式也是一种传值方式,虽然地址传过去是对的但是px,py交换的只是地址,a,b的值并无影响。


/template/Home/leiyu/PC/Static