1.逗号运算符(,)
在c语言中有多个表达式时可以用逗号分开,逗号运算符是所有运算符里级别最低的,它的结合方向是从左至右,其中用逗号分开的表达式分别计算,最终整个表达式的值是最后一个表达式的值。(特别注意运算顺序)
示例:
#include<stdio.h>
int main()
{
int a=2,b=5,c=0;
c=a+b,a-b,b++; //注意运算符优先级;
return 0;
}
此程序中要特别注意运算符优先级,里面赋值运算符“=”级别高于逗号“,”,所以a+b首先赋值给c,然后依次往右执行,最终c的值为7,b的值为6.
#include<stdio.h>
int main()
{
int a=2,b=5,c=0;
c=(a+b,a-b,b++); //注意运算顺序
return 0;
}
此程序比上一个程序只多加了一个括号,但是结果是不相同的,加了括号以后就要最先运算括号内部的,从左往右依次执行,前面说过,用逗号分开的表达式分别计算,最终整个表达式的值是最后一个表达式的值,此时c的值就为6.
2.空语句
简单来说,空语句就是末尾除了分号(;)什么也没有,如:
#include<stdio.h>
int main()
{
int a=0;
; //空,不执行任何操作
int j=1;
return 0;
}
但是空语句可以引起很多不易查找到的错误,在if、while、for后加上分号(;)分号创建了空语句,从而导致if、while、for语句提前结束或造成死循环,在if语句中,圆括号后加分号就相当于没有了判断条件,无论表达式是什么,后面的操作都一样。
示例1:
#include<stdio.h>
int main()
{
int a=0;
scanf("%d",a);
if(a>10) //if(a>10);
{
printf("%d\n",a);
}
return 0;
}
示例2:
#include<stdio.h>
int mian()
{
int i=0;
while(i<10) //while(i<10);
{
printf("i=%-3d",i);
}
return 0;
}
示例3:
#include<stdio.h>
int mian()
{
int i=0;
for(i=0;i<10;i++) //for(i=0;i<10;i++);
{
printf("i=%-3d",i);
}
return 0;
}
以上两个程序都是可以正常执行的,但是在示例1中if(a>10)后面加分号以后,if判断语句不再是后面printf语句的执行条件,所以不管输入的a值是多少都会打印;
在示例2中while(i<10)后加分号就会导致while循环后跟一个空语句成为死循环;
在示例3中for(i=0;i<10;i++)后加分号也是跟一个空语句,for循环中i++等于10时退出循环,最终执行下一个语句,只打印出i=10;
但是空语句不仅如此,只要是编译链接过程中不形成机器代码的语句也是空语句,如:全局变量,静态变量,在编译链接时存放在数据区;
#include<stdio.h>
int c=1; //全局变量,c的数据等于1,是空语句
int main()
{
static int a=0; //空语句
int b=8; //不是空语句
return 0;
}
3.跳转语句(break\continue\goto\return\exit)
3.1break
break只能用于switch语句和循环语句中,用来跳出switch语句和循环语句,然后执行后面的语句。
#include<stdio.h>
int main()
{
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
for(int n=1;n<10;n++)
{
if(n%3==0) break; //当n是3的倍数时跳出循环
printf("%d ",n);
}
printf("\n");
printf("end1\n");
}
printf("\n");
printf("end2\n");
}
return 0;
}
注意:break一次只能跳出一重循环,进而执行此循环之后的语句;
3.2continue
continue只能用于循环语句中,用来终止本次循环,跳过后面语句,然后进行下一次循环(取决于判断条件)。continue与break的区别就在于continue只终止本轮循环,而break跳出整个这一层循环。
#include<stdio.h>
int mian()
{
for(int i=0;i<10;i++)
{
if(i%3==0) continue;
printf("%-3d",i);
}
return 0;
}
注意:使用continue容易再while循环和do while循环中造成死循环
示例:
#include<stdio.h>
int main()
{
int n=100;
int i=0;
while(i<n)
{
if(i%2==0)
{
continue;
}
++i;
}
return 0;
}
此程序有错误,当i=0时执行if语句,continue跳出本轮循环,++i不执行,下一轮循环开始时i仍然等于0,如此往复下去造成死循环。
3.3goto
使用goto时需要设置一个标号语句,这个标号语句控制goto转移到下一个地方。
#include<stdio.h>
int main()
{
for(int i=0;i<10;i++)
{
if(i==5)
{
goto put; //put是标号,可用以字母或下滑线开头的字符串作为标号,如:put、in_put等
}
printf("%-3d",i);
}
put: //标号后加冒号,表示goto转移到这里执行后面的语句
printf("end");
return 0;
}
注意:goto语句一般是需要一次性跳出多重循环时使用
示例:
#include<stdio.h>
int main()
{
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
for(int n=1;n<10;n++)
{
if(n%3==0) goto input; //当n是3的倍数时跳出所有循环
printf("%d ",n);
}
printf("\n");
printf("end1\n");
}
printf("\n");
printf("end2\n");
}
input:
printf("end\n");
return 0;
}
3.4return和exit
return用于结束函数的执行,在主函数中同exit等价,用于终止程序。通常当函数返回类型为void时return可省略也可作为程序或函数的标志。使用exit时要添加头文件"stdlib.h"
示例:
#include<stdio.h>
#include<stdlib.h>
void NULL()
{
return ; //函数结束的标志,也可省略
}
int main()
{
int a=0;
printf("%d\n",a);
return 0; //也可用exit(0)
}
在子函数中return与exit不同的是:return用于将一个值返回给调用者,结束此函数,而exit出现在子函数中时也会终止整个程序。
注意:exit括号内的参数0表示正常(成功)结束,1表示异常终止。
#include<stdio.h>
#include<stdlib.h>
int add(int a,int b)
{
int c=a+b;
return c; //将c的值返回给调用者,结束函数
}
int main()
{
int x=9,y=7,z=0;
z=add(x,y); //z用来接受add函数返回的值
printf("z=%d\n",z);
return 0; //终止程序
}
//最终输出z=16;
#include<stdio.h>
#include<stdlib.h>
int add(int a,int b)
{
int c=a+b;
exir(1); //整个程序异常终止,
return c; //将c的值返回给调用者,结束函数
}
int main()
{
int x=9,y=7,z=0;
z=add(x,b); //z用来接受add函数返回的值
printf("z=%d\n",z);
return 0; //终止程序
}
//什么也不输出;
在c语言中0和1作为exit的参数可分别用EXIT_SUCCESS和EXIT_FAILURE来代替,效果相同,因为EXIT_SUCCESS和EXIT_FAILURE是定义在<stdlib.h>中的宏,值分别为0和1.
- 如有错误请评论指正,谢谢!