动手编写程序:

#include <stdio.h>

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 <stdio.h>

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 <stdio.h>

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 <stdio.h>

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 <stdio.h>

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 <stdio.h>

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 <stdio.h>

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 <stdio.h>

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 <stdio.h>

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 <stdio.h>

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为假,结束循环。

流程图如下所示:

 
for.png

程序执行过程:
第一次,表达式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 <stdio.h>

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 <stdio.h>

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 <stdio.h>

int main()
{
int sum = 0; // 赋初值
for(int i = 1; i <= 100; i++)
{
sum += i;
} printf("total is %d\n", sum);
}

(3)在纸上默写这个程序。

关注微信公众号请扫二维码

小朋友学C语言(5):常量和变量,for循环的更多相关文章

  1. 小朋友学C语言(7)

    数组 一.数组简介 C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合.数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量. 数组的声明并不是声明一个个单独的变量,比 ...

  2. C语言回顾-常量和变量

    1.C语言共32个关键字 1)数据类型关键字 a.基本数据类型 void char int float double b.类型修饰关键字 short long signed unsigned c.复杂 ...

  3. 「C语言」常量和变量的表示、应用和变量命名规则

    在程序运行中,其值不能改变的量成为常量. 在基本数据类型中,常量可分为整型常量.实型常量.符号常量和字符型常量(包括字符常量和字符串常量),现分别介绍如下: 目录: 一.常量 二.C语言标识符 三.变 ...

  4. 小朋友学C语言(6)

    (一) 先动手编写一个程序: #include <stdio.h> int main() { if(1) { printf("The condition is true!\n&q ...

  5. 小朋友学C语言(3):整数、浮点数、字符

    C语言的数据类型有整型.浮点型(就是小数).字符.字符串.数组.结构体等.刚开始学的时候,不要一下子学太多.先学最基本的整型.浮点型和字符. 对于学习程序来说,最重要的是动手操作. 先编写程序: #i ...

  6. 小朋友学C语言(8)

    求圆周率 (一)圆周率简介 圆周率(Pi)是圆的周长与直径的比值,一般用希腊字母π表示,是一个在数学及物理学中普遍存在的数学常数.π也等于圆形之面积与半径平方之比.是精确计算圆周长.圆面积.球体积等几 ...

  7. 小朋友学C语言(2):安装Dev C++编译器

    (一)编译器 编译器是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序.一个现代编译器的主要工作流程:源代码 (source code) -->预处理器 (prepr ...

  8. 小朋友学C语言(1):Hello World

    首先,需要一款C语言的编译器,可以使用在线编译器,也可以在本地安装编译器,比如Mac电脑可以安装Xcode,PC可以安装Dev C++. 若是第一次编写程序,建议使用在线编译器,推荐 菜鸟编译器 编写 ...

  9. 小朋友学C语言(4):单精度浮点数与双精度浮点数

    上节课简单介绍了浮点数.计算机程序中的浮点数分为单精度浮点数和双精度浮点数. 单精度和双精度精确的范围不一样. 计算机里的最基本的存储单位用位(bit)来表示.bit只能用来存储0或1. 稍大一点的单 ...

随机推荐

  1. 记一个视频播放器插件 video.js

    最近在看扣丁学堂上面的一些视频, 突然对他用的视频播放器有点兴趣, 他也是采用的 ts切片播放, 如果使用传统的video标签是无法实现的 他使用的插件叫做 video.js 官网地址 官网提供的播放 ...

  2. vue线上项目,优化前后对比

    优化前: dev初次时间:52s dev时间:5s~6s build时间:374s(6.2分钟) build后zip包大小: vue.vue-router 优化后: dev初次时间:49s.48s.5 ...

  3. create-react-app:reject和不reject(使用react-app-rewired)这2种情况下的antd组件按需引入配置

    create-react-app:eject和不eject(使用react-app-rewired)这2种情况下的antd组件按需引入配置: 不eject(使用react-app-rewired)配置 ...

  4. 代码阅读笔记:【C-COT】

    [C-COT]:Danelljan M, Robinson A, Khan F S, et al. Beyond correlation filters: Learning continuous co ...

  5. spring-IOC容器(二)

    一.bean配置里面使用外部属性文件: <bean>中添加context Schema定义,Spring 提供了一个<property-placeholder>元素,可以在be ...

  6. ASP.NET AJAX入门系列(8):自定义异常处理

    在UpdatePanel控件异步更新时,如果有错误发生,默认情况下会弹出一个Alert对话框显示出错误信息,这对用户来说是不友好的,本文看一下如何在服务端和客户端脚本中自定义异常处理,翻译自官方文档. ...

  7. java集合与包装类

    一.集合概述 1 为什么需要使用集合? 引入案例:存储每天产生的新闻. 是要解决数组的局限性(定长),由于数组定长,可能会导致内存浪费或者内存不够. 需要一种技术:能够根据数据量而动态伸缩内存空间一种 ...

  8. input子系统详解2

    上一节大概了解了输入子系统的流程 这一节认真追踪一下代码 input.c: input_init(void)函数 static int __init input_init(void) { int er ...

  9. 使用vivado将bit文件转化为mcs文件

    使用vivado将bit文件转化为mcs文件 1.在Tcl Console中运行脚本: write_cfgmem -force -format MCS -size 64 -interface spix ...

  10. 内存共享【Delphi版】

    一.原理     通过使用“内存映射文件”,实现内存共享 二.主要操作     共享内存结构: PShareMem = ^TShareMem; TShareMem = Record id:string ...