30天学会C语言: Day 8-无限执行篇

指派/指定 运算子(Assignment Operator)

可以用来设定变数值的运算子,前面用过的 = 就是其中一种,执行时会先将等号右边的值算出来,再指派给左边的变数

除此之外还有: +=, -=, *=, /=, %=,代表 先算出右边的值,再算出左边变数值和右边做数学运算的结果,最後指派给左边的变数

也就是说: a=a+2a+=2 是一样的意思,a=a-2
a-=2 是一样的意思,a=a*2 等效 a*=2a=a/2 等效 a/=2a=a%2 等效 a%=2

#include<stdio.h>
#include<stdlib.h>

int main(){
	int x=0;
	printf("%d\n", x);
	x+=1;
	printf("%d\n", x);
	x+=1;
	printf("%d\n", x);
	x+=1;
	printf("%d\n", x);
	
	return 0;
}

递增/减

++, -- 这两个运算子也可以设定变数的值,功能分别是 设为变数值+1设为变数值-1
也就是说 ++/-- 的功能和 +=1/-=1 相同

#include<stdio.h>
#include<stdlib.h>

int main(){
	int x=0;
	printf("%d\n", x);
	x++;
	printf("%d\n", x);
	x++;
	printf("%d\n", x);
	x++;
	printf("%d\n", x);
	
	return 0;
}

#include<stdio.h>
#include<stdlib.h>

int main(){
	int x=0;
	printf("%d\n", x);
	x--;
	printf("%d\n", x);
	x--;
	printf("%d\n", x);
	x--;
	printf("%d\n", x);
	
	return 0;
}

回圈

用来表示重复执行的指令,有 while()for() 两种

while()

语法和 if() 一样,会先判断条件,成立时执行区块中的内容,不成立则跳过区块

while(<条件>){
	<条件成立时执行的内容>
             ⋮
	<条件成立时执行的内容>
}

差别在一个 if() 只会执行一次,while() 会不断地执行,直到条件不成立为止
也就是说,执行的顺序是: 判断(成立)→区块→判断(成立)→区块→...→区块→判断(不成立)→结束

下面例子中,变数 x 先被设为0,执行到 while() 会先进行条件判断:

  1. 因为0<3,所以会执行区块,视窗上显示0,x 递增1,现在的 x 等於1
  2. 区块结束後会再做一次判断,因为1<3,所以会执行区块,视窗上显示1,x 递增1,现在的 x 等於2
  3. 再做一次判断,因为2<3,所以会执行区块,视窗上显示2,x 递增1,现在的 x 等於3
  4. 再做一次判断,因为3<3不成立,所以会执行区块,回圈结束,继续执行区块後的内容
#include<stdio.h>
#include<stdlib.h>

int main(){
	int x=0;
	while(x<3){
		printf("%d\n", x);
		x+=1;
	}
	printf("End!\n");

	return 0;
}

找出100以内所有2的次方:

#include<stdio.h>
#include<stdlib.h>

int main(){
	int x=1;
	while(x<100){
		printf("%d\n", x);
		x*=2;
	}

	return 0;
}

for()

C语言的 for() 其实和 while() 没有太大的差异,都是先判断,後执行,直到条件不成立,只是 for() 多了 初始化更新 两个部分

for(<初始化>; <条件>; <更新>){
	<条件成立时执行的内容>
             ⋮
	<条件成立时执行的内容>
}

<初始化><更新> 是两个任意的指令,当执行到 for() 时会先执行一次<初始化>,再开始条件判断,之後执行区块,区块结束後会执行一次 <更新>,才继续判断条件是否成立,但之後不会再执行 <初始化>
也就是说,执行的顺序是: <初始化>→判断(成立)→区块→<更新>→判断(成立)→区块→<更新>...→区块→<更新>→判断(不成立)→结束

下面两段程序码的效果相同

int i;
for(i=0; i!=5; i++)
	printf("%d\n", i);

whlie() 前的 i=0 就相当於上面 for() 回圈的 <初始化>printf() 後的 i++ 就相当於 for()<更新>

int i;
i=0;
while(i!=5){
	printf("%d\n", i);
	i++;
}

<初始化><更新> 有多个指令时可以用逗号隔开

#include<stdio.h>
#include<stdlib.h>

int main(){
	int sum, k;
	scanf("%d", k);
	
	int i;
	for(i=1, sum=0; i<=k; i++){
		sum+=i;
	}
	printf("%d\n", sum);

	return 0;
}

假设输入3,isum 会先被设为1和0:

  1. 因为 i 一开始是1,i<=k 成立,所以会执行区块,区块执行後 sum 为1(0+1),i 为2
  2. i!=k 成立,区块执行後 sum 为3(1+2),i 为3
  3. i!=k 成立,区块执行後 sum 为6(3+3),i 为4
  4. i!=k 不成立,回圈结束 sum 为6

利用回圈计算 nk 次方
除了像前面一样另外用一个变数(i)来记录回圈执行的次数,如果区块中的内容和次数无关,也可以用倒数的方式控制回圈

#include<stdio.h>
#include<stdlib.h>

int main(){
	int  n, k, ans;
	scanf("%d%d", &n, &k);
	
	for(ans=1; k!=0; k--){
		ans*=n;
	}
	printf("%d\n", ans);

	return 0;
}

假设输入2和3:

  1. 因为 k 一开始是3,k!=0 成立,所以会执行区块,区块执行後 ans 为2(1×2),k 为2
  2. k!=0 成立,区块执行後 ans 为4(2×2),k 为1
  3. k!=0 成立,区块执行後 ans 为8(4×2),k 为0
  4. k!=0 不成立(此时 i 等於3和 k 相同),回圈结束,ans 为8

假设输入2和0:

  1. k!=0 不成立,回圈结束,ans 为1

break & continue

break 可以强制停止区块的执行,在回圈中常和 if() 一起使用
因为回圈只有在执行区块前才会判断条件,如果条件在区块中已不成立,就需要另外用 if() 做判断,并用 break 结束回圈

下面例子中,在 n 等於16时:

  • n<20 成立,n 递增2变成18,视窗显示18
  • n<20 成立,n 递增2变成20,视窗显示20
  • n<20 成立,回圈结束

所以20还是会被显示

#include<stdio.h>
#include<stdlib.h>

int main(){
	int  n=0;
	while(n<20){
		n+=2;
		printf("%d ", n);
	}

	return 0;
}

printf() 前用 if() 判断,如果 n 大於等於20就结束回圈,20就不会被显示

#include<stdio.h>
#include<stdlib.h>

int main(){
	int  n=0;
	while(n<20){
		n+=2;
		if(n>=20)
			break;
		printf("%d ", n);
	}

	return 0;
}

continue 则是跳过这次的区块,但回圈不会结束(除非回圈的条件也不成立)

下面例子中,当 x 等於16时会执行 continue,所以16会被跳过,但後面的数字仍会被显示出来

#include<stdio.h>
#include<stdlib.h>

int main(){
	int  n=0;
	while(n<20){
		n+=2;
		if(n==16)
			continue;
		printf("%d ", n);
	}

	return 0;
}

补充

新版本的 for()

在较新的版本中,可以用<初始化> 宣告变数,不过变数只能在 for() 的区块中使用

所以下面例子中的 sum 必须在 for() 之前宣告

#include<stdio.h>
#include<stdlib.h>

int main(){
	int sum=0, k;
	scanf("%d", k);
	
	int i;
	for(int i=1; i<=k; i++)
		sum+=i;
	
	printf("%d\n", sum);
	
	return 0;
}

挖坑清单:

  • main() 前面的 int,和最後一行的 return 0;
  • 可以拆成多行的情况
  • \0 在字串、字元中的意思
  • 指标

<<:  Day11:伸缩自如的

>>:  day24 : kong api gateway(上)

Day 21 BeautifulSoup模组三

今天的影片内容为介绍分析项目清单与表格文件的方法 而在影片的後半部,会带大家离开新手村,爬取一个真正...

python 流水号变数

之前打某个程序码时 刚好要设流水号变数 那时用eval 但会出现can't assign to fu...

【演算法】L1-4

L1 Convex Hull 解法:Divide-and-conquer One-Center Pr...

Day 29. 继续来看组件基础 – Components 吧ヾ(*´∀ ˋ*)ノ

欧欧欧,竟然已经到第29天了,时间真的是咻咻咻就过了呢!明天就要结束了,真是感伤(☍﹏⁰) (解脱了...

Day 5 如何撰写Odoo程序 (以Compute为例)

Odoo模组开发实战 目录 1.增加商务逻辑 第一章 增加商务逻辑 1.自动计算 於租金总额栏位设置...