> 文章列表 > C语言控制流程结构中20个注意事项及代码示例

C语言控制流程结构中20个注意事项及代码示例

C语言控制流程结构中20个注意事项及代码示例

相关推荐:控制流程结构


  • 在学习本专栏C语言基础语法:控制流程结构的过程中,将流程控制中可能会出现的错误进行总结,并会持续更新…

  1. if语句的条件表达式中不能使用赋值语句,只能使用比较运算符、逻辑运算符等。
正确代码if (a > b && c < d)
错误代码:if (a = b)

  1. if语句中的代码块必须使用花括号{}括起来,即使只有一条语句。
正确代码:if (a > b) { printf("a大于b"); }
错误代码:if (a > b) printf("a大于b");

  1. switch语句中case标签必须是整数常量表达式,不能是变量或表达式。
正确代码:switch (a) { case 1: printf("a等于1"); break; }
错误代码:switch (a) { case b: printf("a等于b"); break; }

  1. switch语句中每个case标签后必须加上break语句,否则会出现“穿透”现象。
正确代码:switch (a) { case 1: printf("a等于1"); break; case 2: printf("a等于2"); break; }
错误代码:switch (a) { case 1: printf("a等于1"); case 2: printf("a等于2"); }

  1. while语句中的条件表达式必须有结束的条件,否则会出现死循环。
正确代码:while (a < 10) { printf("%d", a); a++; }
错误代码:while (1) { printf("%d", a); a++; }

  1. do-while语句中的代码块至少会被执行一次,循环条件是在代码块执行完后判断的。
正确代码:do { printf("%d", a); a++; } while (a < 10);
错误代码:do printf("%d", a); a++; while (a < 10);

  1. for语句中的循环变量必须在循环开始前初始化,循环条件中不能修改循环变量的值。
正确代码:for (int i = 0; i < 10; i++) { printf("%d", i); }
错误代码:for (int i = 0; i < 10; i++) { i++; printf("%d", i); }

  1. break语句只能在循环语句或switch语句中使用,不能在其他地方使用。
正确代码:while (a < 10) { if (a == 5) break; printf("%d", a); a++; }
错误代码:if (a == 5) break;

  1. continue语句只能在循环语句中使用,不能在其他地方使用。
正确代码:for (int i = 0; i < 10; i++) { if (i == 5) continue; printf("%d", i); }
错误代码:if (i == 5) continue;

  1. goto语句会跳转到指定的标签处执行代码,但容易造成代码混乱,应避免使用。
正确代码:if (a < 0) goto error;
错误代码:goto error; printf("错误");

  1. return语句用于函数中返回值,不能在其他地方使用。
正确代码:int add(int a, int b) { return a + b; }
错误代码:return;

  1. 函数调用时参数的类型和数量必须与函数声明时的参数类型和数量相匹配。
正确代码:int add(int a, int b); add(1, 2);
错误代码:int add(int a, int b); add("1", 2);

  1. 函数调用时参数的传递方式可以是值传递、指针传递或引用传递。
正确代码:int add(int a, int b); int c = add(1, 2);
错误代码:int add(int *a, int *b); int c = add(1, 2);

  1. 数组下标从0开始,不能超出数组的范围。
正确代码:int a[10]; a[0] = 1;
错误代码:int a[10]; a[10] = 1;

  1. 指针变量必须初始化后才能使用,否则会出现未知的结果。
正确代码:int *p = NULL; p = &a;
错误代码:int *p; *p = 1;

  1. 指针变量可以指向任何类型的变量,但在使用时必须进行类型转换。
正确代码:int a = 10; char *p = (char *)&a;
错误代码:char *p = "hello"; int a = *p;

  1. 动态内存分配时必须释放内存,否则会造成内存泄漏。
正确代码:int *p = (int *)malloc(sizeof(int)); free(p);
错误代码:int *p = (int *)malloc(sizeof(int));

  1. 结构体变量的成员访问必须使用“.”运算符,指针变量的成员访问必须使用“->”运算符。
正确代码:struct Student { char name[20]; int age; }; struct Student s; s.age = 18;
错误代码:struct Student { char name[20]; int age; }; struct Student *p; (*p).age = 18;

  1. 位运算符的优先级比算术运算符低,使用时必须加上括号。
正确代码:int a = 1, b = 2; if ((a & b) == 0) printf("a和b的按位与为0");
错误代码:int a = 1, b = 2; if (a & b == 0) printf("a和b的按位与为0");

  1. 递归调用时必须设置终止条件,否则会出现死循环。
正确代码:int factorial(int n) { if (n == 1) return 1; return n * factorial(n - 1); }
错误代码:int factorial(int n) { return n * factorial(n - 1); }

正确代码示例:

#include <stdio.h>
#include <stdlib.h>int main() {// if语句的条件表达式中不能使用赋值语句int a = 1, b = 2, c = 3, d = 4;if (a > b && c < d) {printf("a大于b且c小于d\\n");}// if语句中的代码块必须使用花括号{}括起来if (a > b) {printf("a大于b\\n");} else {printf("a不大于b\\n");}// switch语句中case标签必须是整数常量表达式int x = 1;switch (x) {case 1:printf("x等于1\\n");break;case 2:printf("x等于2\\n");break;default:printf("x不等于1也不等于2\\n");}// switch语句中每个case标签后必须加上break语句int y = 2;switch (y) {case 1:printf("y等于1\\n");break;case 2:printf("y等于2\\n");break;default:printf("y不等于1也不等于2\\n");}// while语句中的条件表达式必须有结束的条件int i = 0;while (i < 10) {printf("%d ", i);i++;}printf("\\n");// do-while语句中的代码块至少会被执行一次int j = 0;do {printf("%d ", j);j++;} while (j < 0);printf("\\n");// for语句中的循环变量必须在循环开始前初始化for (int k = 0; k < 10; k++) {printf("%d ", k);}printf("\\n");// break语句只能在循环语句或switch语句中使用for (int l = 0; l < 10; l++) {if (l == 5) {break;}printf("%d ", l);}printf("\\n");// continue语句只能在循环语句中使用for (int m = 0; m < 10; m++) {if (m == 5) {continue;}printf("%d ", m);}printf("\\n");// goto语句会跳转到指定的标签处执行代码int n = -1;if (n < 0) {goto error;}printf("n大于等于0\\n");
error:printf("n小于0\\n");// return语句用于函数中返回值int add(int a, int b) {return a + b;}printf("1 + 2 = %d\\n", add(1, 2));// 函数调用时参数的类型和数量必须与函数声明时的参数类型和数量相匹配int mul(int a, int b) {return a * b;}printf("2 * 3 = %d\\n", mul(2, 3));// 函数调用时参数的传递方式可以是值传递、指针传递或引用传递void swap(int *a, int *b) {int temp = *a;*a = *b;*b = temp;}int x1 = 1, y1 = 2;swap(&x1, &y1);printf("x1 = %d, y1 = %d\\n", x1, y1);// 数组下标从0开始,不能超出数组的范围int arr[10];for (int i = 0; i < 10; i++) {arr[i] = i * 2;}printf("arr[5] = %d\\n", arr[5]);// 指针变量必须初始化后才能使用int *p = NULL;p = (int *)malloc(sizeof(int));*p = 10;printf("*p = %d\\n", *p);free(p);// 指针变量可以指向任何类型的变量char str[] = "hello";char *p1 = str;printf("p1 = %s\\n", p1);// 动态内存分配时必须释放内存int *p2 = (int *)malloc(sizeof(int));*p2 = 20;printf("*p2 = %d\\n", *p2);free(p2);// 结构体变量的成员访问必须使用“.”运算符struct Student {char name[20];int age;};struct Student s = {"Tom", 18};printf("s.age = %d\\n", s.age);// 指针变量的成员访问必须使用“->”运算符struct Student *p3 = &s;printf("p3->age = %d\\n", p3->age);// 位运算符的优先级比算术运算符低int a1 = 1, b1 = 2;if ((a1 & b1) == 0) {printf("a1和b1的按位与为0\\n");}// 递归调用时必须设置终止条件int factorial(int n) {if (n == 1) {return 1;}return n * factorial(n - 1);}printf("5的阶乘 = %d\\n", factorial(5));return 0;
}

相关推荐:控制流程结构