Day07
前面玩了一天
break语句
在循环体中,如果我们想让程序在中途跳出循环,那么可以使用break语句来实现
例:Day06的求素数问题
我们原来的代码要通过验证2到num/2所有的数,来判断是否能被整除,但若num/2很大。执行的循环次数会变得很大,而其中存在很多不必要的循环,只要添加break语句,会使程序的效率提高很多
代码:
#include <stdio.h>
#include <stdbool.h>
int main()
{
long long i,num;//输入会特别大,用long long int会比较合适
_Bool flag=1;
printf("请输入一个整数\n");
scanf("%lld",&num);// long long对应lld
for(i=2;i<num/2;i++)
{
if(num%i==0)
{
flag=0;
break;//跳出循环
}
}
if (flag==1)
{
printf("%lld是质数\n",num);
}
else
{
printf("%lld不是质数\n",num) ;
}
printf("i=%lld\n",i)//用来看循环次数
return 0;
}
对于break语句,它的作用是跳出它所在那一层的循环,要跳出外层循环也要在外层布置一个break语句
例:
#include <stdio.h>
int main()
{
int i,j;
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
if(j=3)
{
break;
}
}
}
printf("i=%d j=%d\n",i,j);
return 0;
}
输出结果
i=10 j=3
说明外层循环完整执行了,内层循环每轮执行了三次
如果要让程序在j=3时就结束循环,就要在外层再布置一个break语句
#include <stdio.h>
int main()
{
int i,j;
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
if(j=3)
{
break;
}
}
if(j=3)
{
break;
}
}
printf("i=%d j=%d\n",i,j);
return 0;
}
输出结果:
i=0 j=3
continue语句
使用continue语句时,循环体的剩余部分被忽略,直接进入下一次的循环
例:
#include <stdio.h>
int main()
{
int ch;
while((ch=getchar())!='\n')//ch获得键盘输入流的下一个字符
{
if (ch=='c')//ch是否和c的asc值相同
{
continue;
}
putchar(ch);//putchar一次只会输出一个字符
}
return 0;
} // 程序的大意是在用户输入的字符内,凡是有c的都当做看不见
输出结果:
csdwdsawds//我输入的
sdwdsawds//程序输出的
continue语句和break语句一样,只能作用于一层循环
while语句和if语句的转换
例:
#include <stdio.h>
int main()
{
int i;
for(i=0;i<100;i++)
{
if(i%2)
{
continue;
}
}
return 0;
}
改成等价的while语句
错误改法:
#include <stdio.h>
int main()
{
int i;
i=0;
while(i<100)
{
if (i%2)
{
continue;
}
i++;
}
return 0;
}
这种改法会让程序进入死循环,因为continu以下的内容会被跳过,i无法增长
正确的改法:
#include <stdio.h>
int main()
{
int i;
i=0;
while(i<100)
{
i++;
if (i%2)
{
continue;
}
}
return 0;
}
for语句不会出现这样的问题,continue之后不会跳过i++
拾遗
赋值运算符
赋值运算符的左边必须是一个lvalue,变量名就是一个lvalue。
复合的赋值运算符
a=a+1 等价于 a+=1
a=a-2 a-=2
a=a*3 a*=3
以此类推
把算术运算符和赋值运算符兼容在一起
自增自减运算符
i=i+1可以写作i++或++i
i=i-1可以写作i--或--i
++放前与++放后的区别
例:
#include <stdio.h>
int main()
{
int i=5,j;
j=++i;
printf("i=%d,j=%d\n",i,j);
i=5;
j=i++;
printf("i=%d,j=%d\n",i,j);
return 0;
}
输出:
i=6,j=6
i=6,j=5
i++是先使用i变量里的值5给j,再对i进行加1,所以j为5
++i是将i变量里的值加1,再把运算后的结果赋值给j
自增自检运算符只能作用于变量不能作用于常量和表达式
逗号运算符
我们在for语句中能够在第一表达式和第三表达式里使用逗号运算符,来初始化多个值或调节多个变量
但逗号运算符也可以单独使用
语法:表达式1,表达式2,表达式3,…表达式n
-逗号表达式的运算过程为从左到右逐个计算表达式
-逗号表达式作为一个整体有一个值,它的值为最后一个表达式的值
例a=3,5 为a=3;5;(赋值运算符优先级更高)
a=(b=3,(c=b+4)+5);
-先将变量b赋值为3,再将c赋值为7再加5,最后赋值给a,所以a为12(尽管有括号,逗号表达式运算顺序也是从左到右运算)
逗号不一定都是运算符,也会作为分隔符出现,例如:int i,j;
条件运算符 (唯一一个三目)
语法:exp1?exp2:exp3;
exp1是条件表达式
如果结果为真,条件运算符返回的值为exp2的值
如果结果为假,返回值exp3的值
用于替代简单的if else语句
例
if(a>b) max=a>b?a:b
max=a;
else 等价于
max=b;
goto语句
goto语句的作用是直接跳转到指定的标签位置
语法: goto 标签; 其中的标签要定义在某个语句的前面
例:
#include <stdio.h>
int main()
{
int i=5;
while(i++)
{
if(i>10)
{
goto Label;//写对应标签的名字,会直接跳到标签所在的语句然后往下执行
}
}
Label : printf ("i=%d\n",i);//标签的名字可以不是label,可以任意
return 0;
}
这里的while本来是个死循环,但由于goto的存在,得以跳出循环
输出:
i=11
开发中,不要随意使用goto语句,跳来跳去会影响代码的逻辑
但循环后很多层,要从最里面的一层跳到最外边,这种情况可以使用
注释
注释不应该直接写这句话的意思,注释是写给自己看的,要保证代码的复用性
一般可以注释变量的作用,函数的作用,返回值等等
//这是注释,只能写一行
/*这是注释,
可以跨越多行*/
数组
数组,说白了就是存储同种类型数据的地方
数组的定义:类型 数组名[元素个数或常量表达式] 例:int a[6] char b[5]
要先说明元素的个数,才能让c语言申请内存
数组不能动态定义,即c语言不能在程序运行过程中去修改数组空间大小,定义要写在最开头的位置或定义循环变量时写中间
访问数组中的元素
语法:数组名[下标]
a[0];//访问a数组中第一个元素,访问第一个元素的下标是0不是1
b[1];//访问b数组第二个元素
c[5];//访问c数组的第6个元素
数组越界问题
例:
int a[5]
a[5];//报错,第五个元素应该是a[4]
循环跟数组的关系
- 实现一个执行10次的循环,我们一般是这么写的
for(i=0;i<10;i++)//循环变量的初始值我们不设为1而是设为0????
{
.....
}
- 这是因为我们常常需要使用循环来访问数组;
int a[10];
for(i=0;i<10;i++)
{
a[i]=i;
}
养成循环初始值设为0的习惯,这样访问数组就可以避免数组越界的问题
举例:用数组存放十位同学的成绩,并求平均数
#include <stdio.h>
#define NUM 10//方便下面代替
int main()
{
int grade[NUM];
int i,sum=0;
for(i=0;i<10;i++)
{
printf("请输入第%d位同学的成绩\n",i+1);
scanf("%d",&grade[i]);
sum+=grade[i];
}
printf("该次小测的平均分是%.2f\n",(double)sum/NUM);//平均数为小数,将sum定义为double型
return 0;
}
(这个程序给我的启发是可以在循环中使用输入依次给元素赋值,以前没想到能在for里使用scanf)
数组的初始化
在定义数组的同时,就给它赋值
- 将数组中所有元素初始化为0可以这么写:
int a[10]={0};//事实上这里只是将第一个元素赋值为0,后面的元素会自动初始化为0,所以将0改为1不会得到一样的效果
- 如果是赋予不同的值,那么用逗号分隔开来即可
int a[10]={1,2,3,4,5,6,7,8,9,0};
- 你还可以只给一部分元素赋值,未被初始化的元素自动赋值为0
int a[10]={1,2,3,4,5}//表示为前五个元素赋值,后边五个元素系统自动初始化为0,和第一条很相似
倘若没有给元素赋值,那么元素得到的会是内存中随机的数据
- 有时候我们可以偷懒,可以只给各元素的值而不指定数组的长度,编译器可以根据值的个数自动判断数组的长度
int a[]={0,1,2,3,4,5)//数组长度为6
- C99增加了一种新特性:指定初始化的元素。可以只对数组中的某些指定元素进行初始化赋值,而未被赋值的元素自动初始化为0
int a[10]={[3]=3,[5]=5};
对数组使用sizeof函数
例:
printf("%d",sizeof(a))//剩下代码自己脑补啊
输出的结果是数组占用内存的大小