动手编写程序:
#include
int main() { int a = 1; printf("a = %d\n", a); a = 2; printf("a = %d\n", a); return 0; }
运行结果:
a = 1
a = 2
程序分析:
int a = 1;
定义了一个整型变量a,把1赋值给a。注意,C语言中的等号表示赋值,作用是把一个常量赋值给一个变量,这样变量就获得了一个临时的固定值。
为什么说是临时的呢?因为在把另一个常量2赋值给a的时候,a的值就变为了2,不再1了。
注意a = 2不要误写为int a = 2。第一次定义一个变量时,要把变量类型(比如int型)写出来,下次再用到这个变量时,直接使用就行,不用再重新定义。加了类型就是重新定义,不加类型就是直接使用。
从程序的运行结果可以看出,a的第一次的值是1,第二次的值是2。可见a的值是可变的,所以称a为变量。而相应的,1、2、A、B都是固定的值,被称为常量。
编写程序:
#include
int main() { int a = 1; int b = 2; int c = a + b; printf("sum is %d\n", c); return 0; }
运行结果:
sum is 3
程序分析:
先定义一个整型变量a,把1赋值给a。
再定义一个整型变量b,把2赋值给b。
最后定义一个整型变量c,它的值不是靠赋值得到的,而是把a和b相加之后的值赋值给它,即c的值为3。
编写程序:
#include
int add(int x, int y) { int z = x + y; return z; } int main() { int a = 1; int b = 2; int c = add(a, b); printf("c = %d\n", c); return 0; }
运行结果:
c = 3
程序分析:
(1)
函数定义的形式为:
类型 函数名称(类型 形式参数,……)
{
函数体
}
(2)
对应于咱们的程序,定义了一个名为add的函数,add左边的int代表的函数的返回值的类型。对应于函数体中返回的z的类型。
(3)
x和y是形式参数,main()函数中的add(a,b)中a和b是实际参数。
(4)
main函数中的add(a,b)后面没跟大括号,说明是函数调用,不是函数定义。具体的add函数定义在main函数的上方。
(5)
调用add函数时,实际参数(实参)传递给形式参数(形参),这样x = a = 1, y = b = 2
(6)
z = x + y = 1 + 2 = 3
(7)
int c = add(a, b)说明要把add函数得到的值赋给c。即c = add(1, 2) = z = 3。最终c = 3
(一)if...else
先动手编写一个程序
#include
int main() { int x = -1; if(x > 0) { printf("x is a positive number!\n"); } else { printf("x is not a positive number!\n"); } return 0; }
运行结果:
x is not a positive number!
程序分析:
定义一个整数x,并给他赋值。这个值要么大于0,要么不大于0(等于或小于0)。
若是大于0,则打印x is a positive number!
若不大于0,则打印x is not a positive number!
这里建议不要再使用在线编译器,而是使用本机编译器(苹果电脑推荐Xcode,PC推荐dev C++)。在本机编译器上设置断点逐步执行,会发现if中的printf语句和else中的printf语句只会执行一个。这是因为if和else是互斥的关系,不可能都执行。
(二)if...else if...else
稍微改动程序
#include
int main() { int x = 0; if(x > 0) { printf("x is a positive number!\n"); } else if(x == 0) { printf("x is zero!\n"); } else { printf("x is a negative number!\n"); } return 0; }
运行结果:
x is zero!
程序分析:
假如条件不止两种情况,则可用if...else if...else...的句式。
这个程序里的条件分成三种: 大于0、等于0或小于0。
大于0则打印x is a positive number!
等于0则打印x is zero!
小于0则打印x is a negative number!
注意,x == 0,这里的等号是两个,而不是一个。
C语言中,一个等号表示赋值,比如b = 100;
两个等号表示判断等号的左右侧是否相等。
(三)多个else if的使用
#include
int main() { int x = 25; if(x < 0) { printf("x is less than 0\n"); } if(x >= 0 && x <= 10) { printf("x belongs to 0~10\n"); } else if(x >= 11 && x <= 20) { printf("x belongs to 11~20\n"); } else if(x >= 21 && x <= 30) { printf("x belongs to 21~30\n"); } else if(x >= 31 && x <= 40) { printf("x belongs to 31~40\n"); } else { printf("x is greater than 40\n"); } return 0; }
运行结果:
x belongs to 21~30
程序分析:
(1)
这里把x的值分为好几个区间:(负无穷大, 0), [0, 10], [11, 20], [21, 30], [31, 40], (40, 正无穷大)
(负无穷大, 0)用if来判断
[0, 10], [11, 20], [21, 30], [31, 40]用else if来判断
(40, 正无穷大)用else来判断
(2)
符号“&&”代表“并且”,表示“&&”左右两侧的条件都成立时,判断条件才成立。
(一)a++
在C语言或其它语言中,++符号表示“自加”,就是变量在原来的基础上加1。
例1:
a = 0;
a++;
则此时a的值为1。
同样的道理,--表示”自减”。
例2:
a = 100;
a--;
则此时a的值为99。
注意,程序语言里没有”自乘”和”自除”的概念。
验证程序:
#include
int main() { int a = 0; // 给a赋值 a++; printf("After ++, a = %d\n", a); a = 100; // 重新给a赋值 a--; printf("After --, a = %d\n", a); return 0; }
运行结果:
After ++, a = 1
After --, a = 99
(二)++a
除了a++表示自加外,++a也表示自加。同理--a表示自减
验证程序:
#include
int main() { int a = 0; // 给a赋值 ++a; printf("After ++, a = %d\n", a); a = 100; // 重新给a赋值 --a; printf("After --, a = %d\n", a); return 0; }
运行结果:
After ++, a = 1
After --, a = 99
(三)a++与++a的区别
既然a++与++a都是让a自加,那么二者是否完全一样呢?
先看一个程序:
#include
int main() { int a = 0; printf("a = %d\n", a++); printf("a = %d\n", a); printf("a = %d\n", ++a); printf("a = %d\n", a); return 0; }
运行结果:
a = 0
a = 1
a = 2
a = 2
从运行结果可以看出,a++和++a是有区别的:
a++是先读取a的值,再让a的值增加1;
++a是先让a的值增加1,再读取a的值。
先看程序:
#include
int main() { for(int i = 0; i < 5; i++) { printf("i = %d\n", i); } printf("Loop ended!\n"); return 0; }
运行结果:
i = 0
i = 1
i = 2
i = 3
i = 4
Loop ended!
for循环的语句结构为:
for(表达式1; 表达式2; 表达式3)
{
语句;
}
其执行顺序为:
(1)执行表达式1
(2)执行表达式2。表达式2是一个判断语句;若为真,则执行{}中的语句。若为假,则结束for循环
(3)若表达2为真,执行表达式3
(4)执行表达式2
(5)不断重复步骤(3)和步骤(4),直到表达式2为假,结束循环。
流程图如下所示:
程序执行过程:
第一次,表达式1中i的值为0;表达式2中0<5是成立的,打印出i的值。
第二次,表达式3中i++后i变为1;表达式2中1<5是成立的,打印出i的值。
第三次,表达式3中i++后值变为2,表达式2中2<5是成立的,打印出i的值。
第四次,表达式3中i++后值变为3,表达式2中3<5是成立的,打印出i的值。
第五次,表达式3中i++后值变为4,表达式2中4<5是成立的,打印出i的值。
第六次,表达式3中i++后值变为5,表达式2中5<5是不成立的,不执行大括号中的打印语句。循环结束,跳出循环。程序继续往下执行。
作业:
(1)使用断点观察上面程序的每一步的执行过程
(2)根据上面的分析,思考下面的程序的运行结果并动手操作一遍
#include
int main() { for(int i = 0; i < 0; i++) { printf("i = %d\n", i); } printf("Loop ended!\n"); return 0; }
题目:求1+2+3+……+98+99+100
(1)用数学方法求解
(2)编写C语言程序求解
解:
(1)数学方法
S = 1+2+3+……+98+99+100
= (1+100) + (2+99) + (3+98) + …… + (49+52) + (50+51)
= 101 * 50
= 5050
(2)C语言编程
#include
int main() { int sum = 0; // 赋初值 for(int i = 1; i <= 100; i++) { sum = sum + i; } printf("total is %d\n", sum); }
运行结果:
total is 5050
分析:
(1)第一次循环
i = 1, sum = sum + i = 0 + 1 = 1,这里右边的sum的值为初值0,将1赋给左边的sum后,sum的最新值变成了1
(2)第二次循环
i = 2, sum = sum + i = 1 + 2 = 3, 这里右边的sum的值已经通过上一步的计算变成了1。把3赋值给左边的sum后,sum的最新值就成了3
(3)第三次循环
i = 3, sum = sum + i = 3 + 3 = 6, 这里右边的sum的值已经通过上一步的计算变成了3。把计算结果6赋值给左边的sum后,sum的最新值就成了6
(4)第四次循环
i = 4, sum = sum + i = 6 + 4 = 10, 这里右边的sum的值已经通过上一步的计算变成了6。把计算结果10赋值给左边的sum后,sum的最新值就成了10
(5)……这样执行一百次后,得到的结果为5050
新知识点:
sum = sum + i可以写成sum += i,都是让sum和i相加后,把新的值赋给sum。
以后编程尽量使用+=这种方式。
理由:C语言要通过编译器编译,在编译器没开启优化的情况下,两种写法是完全等价的;编译器开启了优化后,+=的执行速度可能会快一点。(这个先有点印象即可,目前不用深入了解)
作业:
(1)调试上面的程序。每次运行到右大括号时,把鼠标悬在sum上面,观察sum的值。
上面的程序会循环100次,调试的时候,循环10次左右就可以step out了。
(2)
把sum = sum + i改成sum += i,运行结果
#include
int main() { int sum = 0; // 赋初值 for(int i = 1; i <= 100; i++) { sum += i; } printf("total is %d\n", sum); }
(3)在纸上默写这个程序。
关注微信公众号请扫二维码