if(条件)
{
语句;
}
只有条件为真,语句才能进行
#include
int main()
{
if (0)
{
printf("你好");
}
return 0;
}
0为假,语句不会运行
运行结果为
#include
int main()
{
if (1)
{
printf("你好");
}
return 0;
}
1为真,语句会运行
运行结果为
因为比较运算式的结果是0或1
条件里面也可以加比较运算式,比较运算式结果为1则运行语句,为0则不运行
#include
int main()
{
int a = 12;
if (a < 13)
{
printf("你好");
}
return 0;
}
if(条件)
{
语句1;
}
else
{
语句2;
}
int main()
{
int age = 0;
scanf("%d",&age);
if (age >= 18)
{
printf("已成年");
}
else
{
printf("未成年");
}
return 0;
}
if(条件1)
{
语句1;
}
else if(条件2)
{
语句2;
}
else
{
语句3;
}
#include
int main()
{
int bmi = 0;
scanf("%d",&bmi);
if (bmi < 18)
{
printf("太轻啦");
}
else if(bmi >= 18.5 && bmi < 24)
{
printf("正常");
}
else
{
printf("太重啦");
}
return 0;
}
else与其离得最近的if匹配
没有输出任何东西,因为else绑定了最近的if,因为a = 0,所以条件1为假,后面的语句就不执行了相当于
#include
int main()
{
int a = 0, b = 2;
if (a == 1)
{
if (b == 2)
printf("1");
else
printf("2");
}
return 0;
}
如果想实现else与第一个if绑定,则需要用{}
如下
#include
int main()
{
int a = 0, b = 2;
if (a == 1)
{
if (b == 2)
{
printf("1");
}
}
else
{
printf("2");
}
return 0;
}
正确写法
#include
int main()
{
int num = 3;
if (num == 3)
{
printf("haha\n");
}
return 0;
}
改良写法
#include
int main()
{
int num = 3;
if (3 == num)
{
printf("haha\n");
}
return 0;
}
可以防止 == 写成 = 而编译器不报错
一个 switch 语句允许测试一个变量等于多个值时的情况。每个值称为一个 case,且被测试的变量会对每个 switch case 进行检查。
switch(expression){
case constant-expression :
statement(s);
break; /* 可选的 */
case constant-expression :
statement(s);
break; /* 可选的 */
/* 您可以有任意数量的 case 语句 */
default : /* 可选的 */
statement(s);
}
switch 语句必须遵循下面的规则:
例1:输入1~7数字,输出星期几
#include
int main()
{
int w = 0;
scanf("%d",&w);
switch (w)
{
case 1:
printf("星期一");
break;
case 2:
printf("星期二");
break;
case 3:
printf("星期三");
break;
case 4:
printf("星期四");
break;
case 5:
printf("星期五");
break;
case 6:
printf("星期六");
break;
case 7:
printf("星期日");
break;
default :
printf("错误");
break;
}
return 0;
}
例2:输入1~5,输出weekday;输入6、7,输出weekend
#include
int main()
{
int w = 0;
scanf("%d",&w);
switch (w)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("weekday\n");
break;
case 6:
case 7:
printf("weekend\n");
break;
default :
printf("错误");
break;
}
return 0;
}
case语句后面可以没有break语句,可以实现多个case语句匹配一个语句。
好习惯
在最后一个case语句的后面最好加一个break语句,防止以后再加case语句时会少一个break语句。
一个 switch 语句可以有一个可选的 default case,出现在 switch 的结尾。default case 可用于在上面所有 case 都不为真时执行一个任务。default case 中的 break 语句不是必需的。
每个switch语句中只能有一个default。
好习惯
在每个switch语句的最后加一个default子句,在default最后最好再加一个break语句。
switch语句中expression可以放字符类型,因为字符类型的ASIIC码是整型
例1:四则运算
#include
int main()
{
double x, y;
char op;
printf("输入表达式:");
scanf("%lf %c %lf", &x, &op, &y);
switch (op)
{
case '+':
printf("%.2lf %c %.2lf = %.2lf\n", x, op, y, x + y);
break;
case '-':
printf("%.2lf %c %.2lf = %.2lf\n", x, op, y, x - y);
break;
case '*':
printf("%.2lf %c %.2lf = %.2lf\n", x, op, y, x * y);
break;
case '/':
if (y != 0)
{
printf("%.2lf %c %.2lf = %.2lf\n", x, op, y, x / y);
break;
}
else
{
printf("除数为0,不能进行除法运算!\n");
}
default:
printf("表达式有误!\n");
break;
}
return 0;
}
switch语句允许嵌套。
您可以把一个 switch 作为一个外部 switch 的语句序列的一部分,即可以在一个 switch 语句内使用另一个 switch 语句。即使内部和外部 switch 的 case 常量包含共同的值,也没有矛盾。
#include
int main()
{
char ch1 = 'A';
char ch2 = 'A';
switch (ch1)
{
case 'A':
printf("这个 A 是外部 switch 的一部分\n");
switch (ch2)
{
case 'A':
printf("这个 A 是内部 switch 的一部分\n");
break;
case 'B': /* 内部 B case 代码 */
printf("这个 B 是内部 switch 的一部分\n");
break;
default :
printf("错误\n");
break;
}
break;
case 'B': /* 外部 B case 代码 */
printf("这个 B 是外部 switch 的一部分\n");
break;
default:
printf("错误\n");
break;
}
return 0;
}
内部switch语句的break只能跳出内部switch语句。
ch2可以换成ch1,即两个switch语句判断的是同一个变量。
例1:
#include
int main()
{
int n = 1, m = 2;
switch (n)
{
//因为n = 1,所以从case 1开始
case 1:
m++;//m变成3
//因为没有break语句,所以控制流继续进行下面的语句
case 2:
n++;//n变成2
case 3:
switch (n)
{
case 1:
n++;
//因为n = 2,所以从case 2开始
case 2:
m++;//m变成4
n++;//n变成3
break;//break语句使内部switch语句结束
default:
printf("Error");
break;
}
//接着进行外部switch语句中的case 4语句
case 4:
m++;//m变成5
break;
default :
printf("Error");
break;
}
//最后输出m = 5 n = 3
printf("m = %d n = %d\n",m,n);
return 0;
}
当给定条件为真时,重复语句或语句组。它会在执行循环主体之前测试条件。
只要给定的条件为真,C 语言中的 while 循环语句会重复执行一个目标语句。
C 语言中 while 循环的语法:
while(condition)
{
statement(s);
}
在这里,statement(s) 可以是一个单独的语句,也可以是几个语句组成的代码块。
condition 可以是任意的表达式,当为任意非零值时都为 true。当条件为 true 时执行循环。 当条件为 false 时,退出循环,程序流将继续执行紧接着循环的下一条语句。
在这里,while 循环的关键点是循环可能一次都不会执行。当条件为 false 时,会跳过循环主体,直接执行紧接着 while 循环的下一条语句。
例1:打印0~10
#include
int main()
{
int a = 0;
while (a <= 10)
{
printf("%d\n",a);
a++;
}
return 0;
}
例2:输入一个字符,输出一个同样的字符
#include
int main()
{
int ch = 0;
while ((ch = getchar()) != EOF)
{
putchar(ch);
}
return 0;
}
用int类型的变量接收getchar的原因是:
getchar函数的返回值是整型,因为getchar在读取错误或遇到end-of-file的情况时会返回EOF,而EOF被定义的值是-1,char类型变量只有1字节,存储不了负数,而int类型有4字节,可以存储负数。
输出的时候会自动回车的原因是:
回车也是字符,也有ASIIC码,在输入a之后输入的回车在输入缓冲区,getchar从输入缓冲区获取字符,所以回车也会被getchar读取,然后被putchar输出。
小细节
#include
int main()
{
char password[20] = { 0 };
printf("请输出密码");
//提示输入密码
scanf("%s",password);
printf("请确认密码(y/n)");
//提示确认密码
int yn = getchar();
if (yn == 'y')
{
printf("yes");
}
else
{
printf("no");
}
return 0;
}
1、在输入密码加回车后,没有输入y/n,就输出了no,原因是:
scanf从缓冲区读了密码123456,但scanf不会读回车,然后回车就被getchar读取,yn就被赋值为回车的ASIIC码,从而导致下面的if-else语句结果只能是运行else中的语句,打印no。
2、scanf不读取回车的原因是:
scanf读取的数据可以通过回车和空格分开,所以scanf不会读取回车和空格。
3、scanf中的password未加&,原因是:
数组的名字可以做地址。
改进
#include
int main()
{
char password[20] = { 0 };
printf("请输出密码");
//提示输入密码
scanf("%s",password);
printf("请确认密码(y/n)");
//提示确认密码
getchar();
int yn = getchar();
if (yn == 'y')
{
printf("yes");
}
else
{
printf("no");
}
return 0;
}
多加了一个getchar把回车读取。
例3:
#include
int main()
{
char password[20] = { 0 };
printf("请输出密码");
//提示输入密码
scanf("%s",password);
printf("请确认密码(y/n)");
//提示确认密码
getchar();
int yn = getchar();
if (yn == 'y')
{
printf("yes");
}
else
{
printf("no");
}
return 0;
}
改进之后的代码依旧出现了之前的问题,原因是:
scanf读取123456作为密码,因为中间有空格,scanf在空格处停止读取,没有读取空格,后面的getchar读取了空格,但后面还有字符,所以又出现了之前的情况。
改进
#include
int main()
{
char password[20] = { 0 };
printf("请输出密码");
//提示输入密码
scanf("%s",password);
printf("请确认密码(y/n)");
//提示确认密码
int ch = 0;
while ((ch = getchar()) != '\n')
{
;
}
int yn = getchar();
if (yn == 'y')
{
printf("yes");
}
else
{
printf("no");
}
return 0;
}
while循环直接把空格和后面字符的全读取了。
小细节
#include
int main()
{
char i = '\0';
printf("%d",i);
return 0;
}
\0的ASIIC码值是0。
#include
int main()
{
while (1)
{
printf("hehe\n");
}
return 0;
}
运行此程序,会一直打印hehe。
注意:您可以按 Ctrl + C 键终止一个无限循环。
多次执行一个语句序列,简化管理循环变量的代码。
for 循环允许您编写一个执行指定次数的循环控制结构。
C 语言中 for 循环的语法:
for ( init; condition; increment )
{
statement(s);
}
下面是 for 循环的控制流:
例1:打印1~10
#include
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
printf("%d ",i);
}
return 0;
}
如果条件永远不为假,则循环将变成无限循环。for 循环在传统意义上可用于实现无限循环。由于构成循环的三个表达式中任何一个都不是必需的,您可以将某些条件表达式留空来构成一个无限循环。
for循环的判断部分省略代表着这部分会恒成立,从而导致死循环。
#include
int main()
{
for (;;)
{
printf("hehe\n");
}
return 0;
}
当条件表达式不存在时,它被假设为真。您也可以设置一个初始值和增量表达式,但是一般情况下,C 程序员偏向于使用 for(;;) 结构来表示一个无限循环。
注意:您可以按 Ctrl + C 键终止一个无限循环。
1、最好不要在for循环体内修改循环变量,防止for循环失去控制。
2、建议for语句的循环控制变量的取值采用 ( 前闭后开区间 ) 写法。
#include
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int i = 0;
for (i = 0; i < 10; i++)//左闭右开,很好看出是循环10次
{
printf("%d ",arr[i]);
}
return 0;
}
初始化语句可以省略,但不建议省略。
#include
int main()
{
int i = 1;
for (i = 1; i <= 10; i++)
{
printf("%d ",i);
}
return 0;
}
#include
int main()
{
int i = 1;
for (; i <= 10; i++)
{
printf("%d ",i);
}
return 0;
}
两个程序运行结果一样,都是:
但不建议第二种。
原因:
在写嵌套循环时,要写初始化语句。
#include
int main()
{
int i = 1;
int j = 1;
for (i = 1; i <= 3; i++)
{
for (j = 1; j <= 3; j++)
{
printf("hehe\n");
}
}
return 0;
}
运行结果:
#include
int main()
{
int i = 1;
int j = 1;
for (; i <= 3; i++)
{
for (; j <= 3; j++)
{
printf("hehe\n");
}
}
return 0;
}
运行结果:
两种写法输出结果不一样,不推荐第二种写法。
直接在for内部初始化变量。
#include
int main()
{
for (int i = 1; i <= 10; i++)
{
printf("hehe\n");
}
return 0;
}
这种写法只有两种情况下支持:
1、C99标准支持这种写法;
2、C++中支持这种写法。
for语句中条件为真则执行循环,为假则不执行。
非0为真,0为假。
#include
int main()
{
int i = 0;
int k = 0;
for (i = 0,k = 0; k = 0; i++,k++)
{
printf("hehe\n");
}
return 0;
}
k = 0为把0赋值给k,k为0,条件为假,循环不进行。
除了它是在循环主体结尾测试条件外,其他与 while 语句类似。
不像 for 和 while 循环,它们是在循环头部测试循环条件。在 C 语言中,do...while 循环是在循环的尾部检查它的条件。
do...while 循环与 while 循环类似,但是 do...while 循环会确保至少执行一次循环。
C 语言中 do...while 循环的语法:
do
{
statement(s);
}while( condition );
即使while()中的条件不满足,也会执行一次循环体,因为他是先执行循环体,再判断循环条件。
请注意,条件表达式出现在循环的尾部,所以循环中的 statement(s) 会在条件被测试之前至少执行一次。
如果条件为真,控制流会跳转回上面的 do,然后重新执行循环中的 statement(s)。这个过程会不断重复,直到给定条件变为假为止。
例1:即使条件不满足,也会执行一次循环体。
#include
int main()
{
int i = 1;
do
{
printf("hehe\n");
} while (i > 1);
return 0;
}
例1:打印1~10
#include
int main()
{
int i = 1;
do
{
printf("%d ",i);
i++;
} while (i <= 10);
return 0;
}
for语句:
#include
int main()
{
int i = 1,a = 1,result = 1;
scanf("%d",&a);
for (i = 1; i <= a; i++)
{
result = result * i;
}
printf("%d",result);
return 0;
}
while语句:
#include
int main()
{
int i = 1,a = 1,result = 1;
scanf("%d",&a);
while (i <= a)
{
result = result * i;
i++;
}
printf("%d",result);
return 0;
}
do while语句:
#include
int main()
{
int i = 1,a = 1,result = 1;
scanf("%d",&a);
do
{
result = result * i;
i++;
} while (i <= a);
printf("%d",result);
return 0;
}
递归:
#include
int jiecheng(int n)
{
if (n == 1)
{
return 1;
}
return n * jiecheng(n - 1);
}
int main()
{
int n = 0;
scanf("%d",&n);
int res = jiecheng(n);
printf("%d",res);
return 0;
}
for语句:
单个for语句
#include
int main()
{
int n = 0,i = 1,result = 1,sum = 0;
scanf("%d",&n);
for (i = 1; i <= n; i++)
{
result = result * i;
sum = sum + result;
}
printf("%d",sum);
return 0;
}
嵌套for循环
#include
int main()
{
int i = 1, j = 1, n = 0,res = 1,total = 0;
scanf("%d",&n);
for (i = 1; i <= n; i++)
{
for (res = 1,j = 1; j <= i; j++)
{
res = res * j;
}
total = total + res;
}
printf("%d",total);
return 0;
}
while语句:
单个while语句
#include
int main()
{
int n = 0,i = 1,result = 1,sum = 0;
scanf("%d",&n);
while(i <= n)
{
result = result * i;
sum = sum + result;
i++;
}
printf("%d",sum);
return 0;
}
嵌套while语句
#include
int main()
{
int i = 1, j = 1, n = 0,res = 1,total = 0;
scanf("%d",&n);
while(i <= n)
{
res = 1, j = 1;
while(j <= i)
{
res = res * j;
j++;
}
total = total + res;
i++;
}
printf("%d",total);
return 0;
}
do while语句:
单个do while语句
#include
int main()
{
int n = 0,i = 1,result = 1,sum = 0;
scanf("%d",&n);
do
{
result = result * i;
sum = sum + result;
i++;
}while (i <= n);
printf("%d",sum);
return 0;
}
嵌套do while语句
#include
int main()
{
int i = 1, j = 1, n = 0,res = 1,total = 0;
scanf("%d",&n);
do
{
res = 1, j = 1;
do
{
res = res * j;
j++;
}while (j <= i);
total = total + res;
i++;
}while (i <= n);
printf("%d",total);
return 0;
}
递归:
#include
int jiecheng(int n)
{
if (n == 1)
{
return 1;
}
return n * jiecheng(n - 1);
}
int main()
{
int n = 0,i = 1,result = 0;
scanf("%d",&n);
for (i = 1; i <= n; i++)
{
result = result + jiecheng(i);
}
printf("%d",result);
return 0;
}
for语句:
#include
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int i = 0;
int k = 7;
//找具体的某个数k
int sz = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i < sz; i++)
{
if (arr[i] == k)
{
printf("找到了,下标为:%d\n",i);
break;
}
}
if (i == sz)
{
printf("未找到\n");
}
return 0;
}
二分查找:
#include
int main()
{
int arr[100] = {0},i = 1,j = 0;
for (i = 1,j = 0; i <= 100; i++,j++)
{
arr[j] = i;
}
//将1~100存到数组arr中
int k = 66;//要找66
int sz = sizeof(arr) / sizeof(arr[0]);//求数组的大小
int left = 0;//定义左下标
int right = sz - 1;//右下标
while (left <= right)//左下标应该在右下标左边或与右下标相等
{
int mid = left + (right - left) / 2;//二分求中间下标
if (arr[mid] > k) //中间下标对应的数字比要找的数字大
{
right = mid - 1;//右下标变为中间下标左边多一个的下标
}
else if (arr[mid] < k)//中间下标对应的数字比要找的数字小
{
left = mid + 1;//左下标变为中间下标右边多一个的下标
}
else //如果左右下标相等,则找到数字的下标
{
printf("找到了%d",left);//数字的下标为左下标或右下标
break;
}
}
//上述循环当无法找到指定数字(及指定数字在数组中不存在时),会使左下标大于右下标
if (left > right)//当左下标大于右下标时,找不到指定数字
{
printf("找不到");
}
return 0;
}
h#########d
he#######ld
hel#####rld
hell###orld
hello#world
hello world
利用循环:
#include
#include
void printArray(char array[],int x)
{
for (int i = 0;i < x - 1;i++)
{
printf("%c",array[i]);
}
printf("\n");
}
int main()
{
char ch1[] = "###########";
char ch2[] = "hello world";
int sz = sizeof(ch1);
int left = 0,right = sz - 2;
while(left <= right)
{
ch1[left] = ch2[left];
ch1[right] = ch2[right];
printArray(ch1,sz);
Sleep(1000);
left++;
right--;
}
return 0;
}
Sleep()函数需要的头文件为Windows.h
可以实现程序执行的延续使程序执行更可视
再加一些小细节
system()库函数需要的头文件为stdlib.h
可以实现字符在同一行内变换
#include
#include
#include
void printArray(char array[],int x)
{
for (int i = 0;i < x - 1;i++)
{
printf("%c",array[i]);
}
printf("\n");
}
int main()
{
char ch1[] = "###########";
char ch2[] = "hello world";
int sz = sizeof(ch1);
int left = 0,right = sz - 2;
while(left <= right)
{
ch1[left] = ch2[left];
ch1[right] = ch2[right];
printArray(ch1,sz);
Sleep(1000);
left++;
right--;
if (left <= right)
{
system("cls");
}
}
return 0;
}
方法一
#include
#include
int main()
{
char arr1[10] = { '\0' };
printf("请设置你的密码(8位):");
scanf("%s", arr1);
printf("现在开始登陆\n");
int i = 0;
char arr2[10] = {'\0'};
printf("你只有三次机会,请输入正确的密码\n");
while (i < 3)
{
if (i == 0)
{
printf("请输入密码(8位):");
scanf("%s", arr2);
}
else
{
printf("请再次输入密码(8位):");
scanf("%s",arr2);
}
int left = 0;
int lenth1 = (int)strlen(arr1);
int lenth2 = (int)strlen(arr2);
if (lenth1 == lenth2)
{
int counter = 0;
while (left < lenth1)
{
if (arr1[left] == arr2[left])
{
counter++;
}
left++;
}
if (counter == 8)
{
printf("密码正确!\n");
break;
}
else
{
printf("密码错误,你还有%d次机会\n",2 - i);
}
}
else
{
printf("密码长度错误,你还有%d次机会\n",2 - i);
}
i++;
}
return 0;
}
小细节
1、这其中scanf("%s",arr1)中数组变量没有取地址是因为数组变量的表变量名就是其首元素的地址
2、在函数传参的时候,将数组变量作为参数传参时,数组变量会退化成其地址及指针变量
#include
void print(int array[])
{
int sz = sizeof(array);
printf("%d",sz);
}
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
print(arr);
return 0;
}
整型变量是4字节,数组中有10个整型数据,数组的大小应是40字节,而屏幕上打印的却是8字节,原因是在函数传参的时候,将数组变量作为参数传参时,数组变量会退化成其地址及指针变量,所以屏幕上打印的是指针变量的大小。所以在传参时,要将数组的大小也传进去。
方法二
使用strcmp()函数,头文件是string.h
功能:按照ASCII码顺序比较两个数组中的字符串,并由函数返回值返回比较结果。
字符串1 == 字符串2,返回值 = 0;
字符串1 > 字符串2,返回值 > 0;
字符串1 < 字符串2,返回值 < 0。
#include
#include
int main()
{
char arr1[10] = { '\0' };
printf("请设置你的密码(8位):");
scanf("%s", arr1);
printf("现在开始登陆\n");
int i = 0;
char arr2[10] = {'\0'};
printf("你只有三次机会,请输入正确的密码\n");
while (i < 3)
{
if (i == 0)
{
printf("请输入密码:");
scanf("%s", arr2);
}
else
{
printf("请再次输入密码:");
scanf("%s", arr2);
}
if (strcmp(arr1, arr2) == 0)
{
printf("密码正确!\n");
break;
}
else
{
printf("密码错误,你还有%d次机会\n",2 - i);
}
i++;
}
return 0;
}
while语句循环
#include
#include
#include
int main()
{
srand((unsigned int)time(NULL));
int num = rand() % 100 + 1;
printf("你只有八次机会\n");
int i = 0;
while (i < 8)
{
printf("请输入数字:");
int in = 0;
scanf("%d",&in);
if (in == num)
{
printf("对了!\n");
break;
}
else if(in < num)
{
printf("小了!\n");
}
else if(in > num)
{
printf("大了!\n");
}
printf("你只有%d次机会了哦!\n",7 - i);
i++;
}
return 0;
}
函数递归
#include
#include
#include
void game(int x)
{
int g = 0;
scanf("%d",&g);
if (g == x)
{
printf("对了!\n");
}
else if(g < x)
{
printf("小了!\n");
game(x);
}
else if (g > x)
{
printf("大了!\n");
game(x);
}
}
int main()
{
srand((unsigned int)time(NULL));
int num = rand() % 100 + 1;
game(num);
return 0;
}
终止循环或 switch 语句,程序流将继续执行紧接着循环或 switch 的下一条语句。
C 语言中 break 语句有以下两种用法:
如果您使用的是嵌套循环(即一个循环内嵌套另一个循环),break 语句会停止执行最内层的循环,然后开始执行该块之后的下一行代码。
C 语言中 break 语句的语法:
break;
在switch语句中的应用
#include
int main()
{
int i = 0;
scanf("%d",&i);
switch(i)
{
case 1:
printf("1");
break;
case 2:
printf("2");
break;
default :
printf("其他");
break;
}
return 0;
}
在循环中的运用
#include
int main()
{
int i = 0;
while (i < 10)
{
if (i == 5)
{
break;
}
printf("%d ",i);
i++;
}
return 0;
}
例1:用五分制表示成绩
#include
int main()
{
int score = 0;
scanf("%d",&score);
int scoreTrans = score / 10;
switch (scoreTrans)
{
case 10:
case 9:
printf("A");
break;
case 8:
printf("B");
break;
case 7:
printf("C");
break;
case 6:
printf("D");
break;
default :
printf("F");
break;
}
return 0;
}
例2:输入字时输出字母,输入数字时退出程序
#include
int main()
{
int ch = 0;
while ((ch = getchar()) != EOF)
{
if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'))
{
putchar(ch);
}
else if (ch >= '0' && ch <= '9')
{
break;
}
else
{
printf("错误!\n");
}
}
return 0;
}
将控制转移到被标记的语句。但是不建议在程序中使用 goto 语句。
C 语言中的 goto 语句允许把控制无条件转移到同一函数内的被标记的语句。
注意:在任何编程语言中,都不建议使用 goto 语句。因为它使得程序的控制流难以跟踪,使程序难以理解和难以修改。任何使用 goto 语句的程序可以改写成不需要使用 goto 语句的写法。
C 语言中 goto 语句的语法:
goto label;
...
label: statement;
在这里,label 可以是任何除 C 关键字以外的纯文本,它可以设置在 C 程序中 goto 语句的前面或者后面。
但是在某些情况下goto语句还是用得着的,最常见的方法就是终止程序在某些深度嵌套的的结构的处理过程
例如:一次跳出两层或多层循环
情况
for (...)
{
for (...)
{
for (...)
{
if (errorAppear)//错误发生
{
goto errorSolveStatememt;//直接跳到解决错误语句
}
}
}
}
...
errorSolveStatememt://解决错误语句
if (errorAppear)//若错误发生
{
...//解决错误的具体方法
}
实例:关机程序
1、电脑运行起来后,一分钟后关机
2、如果输入“我是猪”,就可以取消关机
需要system库函数,需要的头文件是stdlib.h
system("shutdown -s -t 60");//电脑在60秒之后关机
system("shutdown -a");//取消关机
goto语句
#include
#include
#include
int main()
{
char input[20] = {0};
system("shutdown -s -t 60");
printf("你的电脑将在六十秒后关机\n");
printf("你可以输入“我是猪”来取消关机\n");
again:
scanf("%s",input);
if (strcmp(input, "我是猪") == 0)
{
system("shutdown -a");
printf("真听话,关机已取消\n");
}
else
{
printf("你输错了,请重新输入\n");
goto again;
}
return 0;
}
while语句
#include
#include
#include
int main()
{
char input[20] = {0};
system("shutdown -s -t 60");
printf("你的电脑将在六十秒后关机\n");
printf("你可以输入“我是猪”来取消关机\n");
while (strcmp(input, "我是猪") != 0)
{
scanf("%s", input);
if (strcmp(input, "我是猪") == 0)
{
system("shutdown -a");
printf("真听话,关机已取消\n");
}
else
{
printf("你输错了,请重新输入\n");
}
}
return 0;
}
#include
int main()
{
again:
printf("haha\n");
goto again;
return 0;
}
告诉一个循环体立刻停止本次循环迭代,重新开始下次循环迭代。
C 语言中的 continue 语句有点像 break 语句。但它不是强制终止,continue 会跳过当前循环中的代码,强迫开始下一次循环。
对于 for 循环,continue 语句执行后自增语句仍然会执行。对于 while 和 do...while 循环,continue 语句重新执行条件判断语句,对于自增语句有不同的情况,若自增在continue之前不会造成无限循环,而自增语句在continue之后可能造成无限循环。
#include
int main()
{
int i = 1;
for(i = 1;i <= 10;i++)
{
if (i == 5)
{
continue;
}
printf("%d ",i);
}
return 0;
}
执行之后打印1 2 3 4 6 7 8 9 10
#include
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
{
continue;
}
printf("%d ",i);
i++;
}
return 0;
}
执行后打印1 2 3 4然后死循环
例1:打印1 2 3 4 6 7 8 9 10
#include
int main()
{
int i = 0;
while(i <= 9)
{
i++;
if (i == 5)
{
continue;
}
printf("%d ",i);
}
return 0;
}
函数的返回值是指函数被调用之后,执行函数体中的代码所得到的结果,这个结果通过 return 语句返回。
return 语句的一般形式为:
return 表达式;
或:
return (表达式);
1、为调用的函数返回参数值
int Add(int x, int y)
{
return (x + y);
}
2、提前结束函数
由于return具有把程序流程从被调函数转向主调函数的作用,所以时候也会用来终止函数的调用,也就是说return是提前结束函数的唯一方法。 因为函数一遇到return就立即返回,return后面的程序都不再执行,所以一个函数中可以有多个return,但只会执行一个。 return后面可以跟一个参数作为返回值,也可以不跟参数,仅仅代表结束此函数。
int fun(int x)
{
if (x == 0)
{
return 0;
}
else if (x == 1)
{
return 1;
}
}
3、返回一个函数
如果return后面跟的是一个函数的话,就意味着,跳出此调用函数,并且跳出后执行return后的函数,然后继续在主函数中执行程序。有时利用return返回一个操作,比如在程序调试中出错后,需要return跳出错误函数并向串口打印出错误的原因,这个时候return后面的函数就用来向窗口打印错误原因的。
int Add(int x, int y)
{
return (x + y);
}
int fun(int x,int y)
{
return Add(x,y);
}
例1:写一个加法函数,函数的返回值为两个变量的和
#include
int Add(int x, int y)
{
return (x + y);
}
int main()
{
int a = 10, b = 20;
int res = Add(a,b);
printf("%d",res);
return 0;
}
如有错误,感谢指正。