「C」 函数、运算、流程控制
一、函数
(一)什么是函数
任何一个C语言程序都是由一个或者多个程序段(小程序)构成的,每个程序段都有自己的功能,我们一般称这些程序段为“函数”。
(二)函数的定义
目的:将一个常用的功能封装起来,方便以后调用
步骤:确定函数名,确定函数体,调用
格式:返回值类型 函数名(形式参数列表)
{函数体}
(三)函数的调用
示例:
(四)函数的参数
①. 形参:定义函数时,函数名后面的参数 如num1和num2
②. 实参:调用函数时,传人的具体数据 如a和b
③. 形参和实参的个数必须相等
④. 函数体内部不能定义和形参同名的变量
⑤. 如果是基本的数据类型作为形参,则是纯粹的值传递,修改函数内部形参的值并不会影响到实参的值
⑥. 一个函数可以没有形参,也可以有无限个形参
(五)函数的返回值
1.return 的作用:
①. 退出函数
②. 返回一个具体的值给函数的调用者
2.返回值使用注意:
①. C语言是弱语法弱类型的语言,非常不严格
②. 如果没有写清楚返回值的类型,则默认为int型的
③. void代表没有返回值
④. 就算明确声明了返回值类型,也可以不返回任何的值
⑤. C语言默认情况下,不允许有两个同名的函数
(六)函数使用注意
①. 默认不允许函数重名
②. 函数之间是平等的,不能够嵌套定义
③. 函数不可以重复定义,但是可以重复声明,只要是在调用前声明就可以,地方随便
④. 函数如果是只要声明没有定义,那么编译可以成功,但链接时会失效
(七)多人协作开发
#include<stdio.h>是一个系统头文件。
#include<abc.txt>相当于把abc.txt文件中的所有内容以纯文本的方式拷贝到当前位置。
""表示文件与.c文件处于同一路径,可以使用相对路径也可以使用绝对路径。左边有/的是绝对路径,没有/则为相对路径。
注意:自定义的文件使用"",系统文件使用<>。
函数如果在调用时,函数定义在调用之后,且前面没有进行相应的声明,则编译器报错;
调用函数,没有函数声明,编译器不会报错,链接时报错,不定义函数反而不报错。
链接:把项目中所以相关的.o目标文件和c语言的函数库合并在一起,生成可执行文件。
通常:
①. 函数的定义放在.c文件中,函数的声明放在.h文件中
②. 如果要是有某个.c文件中定义的函数,只需要包含.c文件对应的.h文件即可
③. .h文件生下来就是打酱油被别人拿来拷贝包含的,编译链接时不用写出
(八)函数的补充
(1)main函数
返回值是返回给操作系统的,0为正常退出,其他值为非正常退出。
(2)printf函数
返回值为字符数。如printf("abc");则返回值为3,若printf("abc男\n");的返回值为7,因为一个中文在 Mac OS X 系统中占3个字符。
(3)scanf函数
①.使用前必须加入#include <stdio.h>。
②.调用scanf函数时,需要传入变量的地址作为参数,scanf函数会等待输入数据,并且将输入的数据赋值给地址对应的变量。
③.用scanf函数接收多个数值时,数值之间的分隔符是任意的。
④.scanf的第一个参数中不要包含\n,比如scanf("%d\n", &a); 这将导致scanf函数无法结束。
二、运算
(一)算术运算
C语言一共有34种运算符,包括常见的加减乘除运算
①. 加法:+ 还可以表示正号
②. 减法:- 还可以表示负号
③. 乘法:* 非数学意义上的X
④. 除法:/ 注意1/2的值为0,并不是二分之一
⑤. 取余(模运算):两个整数相除之后的余数(注意两边都必须是整数,正负性取决于%左侧的数值)
注意:
①. int a = 10.8;//丢失精度。结果为10——自动类型转换
②. int a = (int)10.8;//把10.8强制转换为整型——强制类型转换
③. Double c = 10.6 + 6//结果为16.600000。在计算机中,拿两个数值进行运算,如果类型不同则进行自动类型提升。即把6转为6.000000后再参与运算——自动类型提升
(二)赋值运算
①.简单赋值
int a = 10 + 5;a = b = 10;//从右向左,左边不能为常量
②.复合赋值
a = a + 5; => a += 5;
a = a * 5; => a *= 5;
a += 5 * 6 + 4; => a = a +(5 * 6 + 4)
提示:运算顺序取决于运算符的优先级和结合的顺序。
(三)自增自减
int a = 10;
把a的值加1有四种方法:
①. a = a + 1;
②. a += 1;
③. a++;
④. ++a;
简单区分a++和++a。
int b;
int a = 10;
b = ++a; //a == 11,b == 11;a先把值加1为11,再赋值给b
b = a++; //a == 11,b == 10;a先把值10复制给b,a自己再加1为11
b = (a++) + (++a); //a1 == 10,a2 == 12,b == 22
b = (++a) + (a++); //a1 == 11,a2 == 11,b == 22
注意:int d = 10++;//这种写法是错误的,因为对常量进行自加和自减没有任何意义。
(四)sizeof
作用:用来计算变量,常量或者是一种数据类型所占的内存字节数。
基本形式:sizeof(变量名|常量|数据类型),完成之后返回一个值。
①. Sizeof 变量|常量
②. Sizeof (变量|常量)
③. Sizeof (数据类型)
注意:数据类型一定要用括号括起来,不能写成sizeof 数据类型这样的形式。
(五)关系运算
(1)条件判断
默认情况下。在程序中写出的每一句正确的代码都会被执行,但很多时候我们需要在某个条件成立的情形下才执行某一段代码,如登录操作,这种情况可以使用条件语句来完成。
(2)真假
在C语言中,条件成立称为“真”,条件不成立称为“假”。
C语言规定,任何数值都有真假性,任何非0值都为真,只有0才为假,无布尔类型。
(3)关系比较
关系运算的结果只有两种情况,如果条件成立就为真,值为1,如果条件不成立就为假,值为0。有6种运算符,分别是:(1) < (2) <= (3) > (4) >= (5) == (6) !=
(4)使用注意
①. == 和 != 优先级相等,其他四个关系运算符的优先级相等,且前者的优先级低于后者。如2 == 3 > 1 应该先计算3 > 1
②. 关系运算符中,若优先级相同,则“从左往右”结合。如4 > 3 < 2,先计算4 > 3
③. 关系运算符的优先级低于算术运算符。如3 + 4 > 8 - 2 相当于(3 + 4) > (8 - 2)
④. 练习5 != 4 + 2 * 7 > 3 == 10 先计算5 != 18 > 3 == 10,5 != 1 == 10,1 == 10,假
(六)逻辑运算
逻辑运算的结果只有两个:真(0)和假(1)
①. 逻辑与 && 条件1 && 条件2 只有的那个条件1和条件2都成立时,才为真否则为假。
②. 逻辑或 || 条件1 || 条件2 当条件1或条件2中有一个成立时就为真,都不成立时为假。
③. 逻辑非 ! !条件 取反
注意:逻辑运算符在进行运算时,只要能够确定整体的真假性,后面的条件就不再进行而是直接忽略。
int a = b = 10;
int c = (a > 5) && (++b >= 11);//此时a == 10,b == 11,c == 1
int c = (a < 5) && (++b >= 11);//此时a == 10,b == 10,c == 0
提示:在进行逻辑运算时,如果搞不清楚各个符号的优先级,可以使用()。
(七)三目运算
双目:需要两个值参与运算
单目:1个数值参与运算 如!5
三目:需要3个数值参与
格式:条件?数值1:数值2
先判断?前的条件,若条件成立则返回数值1,若条件不成立则返回条件2。
要求比较a和b的值,把数值大的存入到c中 c = a > b ? a : b
比较a,b,c三个数的值,把最大的值存入到d中
int abmax = (a > b) ? a : b;
d = abmax > c : abmax : c;
三、流程控制
(一)流程控制结构
(1)顺序结构:按照书写顺序执行每一条语句。
(2)选择结构:对给定的条件进行判断,根据判断结果来决定执行哪一段代码。
(3)循环结构:在给定条件成立的情况下,反复执行某一段代码。
(二)选择结构 - if
(1)if简单使用
1) 第一种结构:
如果条件为真,就执行后面的语句,否则不执行。
if(条件)
{
语句1;
语句2;
……
}
2) 第二种结构:
如果条件成立就执行语句1,否则执行语句2。
if(条件)
{
语句1;
}
else
{
语句2;
}
3) 第三种结构:
先判断条件1,若成立则执行语句1,其它不执行;若条件1不成立,则检查条件2……
【注意】如果条件3成立,则说明前面的都不成立。所有的语句块只有一个会被执行。
if(条件1)
{
语句1;
}
else if(条件2)
{
语句2;
}
else (条件3)
{
语句3;
}
4) 第四种结构:
在这种情况下,当条件成立,只执行语句1,语句2不属于次条件结构,但不推荐此种写法。
if(条件)
语句1;
语句2;
(2)if使用注意
①.推荐使用if(0==a)这种写法。
②. 注意赋值运算符,不要把==写成是=。
③. If(条件)后面不要加分号。
④. 注意作用域的问题,如果要在if后面定义新的变量,则一定要使用大括号。
(3)if练习
输入一个整数score代表分数,根据分数输出等级(A-E)
A:90~100 B:80~89 C:70~79 D:60~69 E:0~60
1 #include<stdio.h>
2
3 int main(){
4
5 //定义变量存储分数值
6
7 int score;
8
9 //提示输入
10
11 printf("请输入分值:\n");
12
13 //接受输入
14
15 scanf("%d",&score);
16
17 //判断等级
18
19 if(score>=90&&score<=100)
20
21 printf("A\n");
22
23 else if(score>=80)
24
25 printf("B\n");
26
27 else if(score>=70)
28
29 printf("C\n");
30
31 else if(score>=60)
32
33 printf("D\n");
34
35 else
36
37 printf("E\n");
38
39 return 0;
40
41 }
(三)选择结构 - switch
(1)switch结构
switch(值) //通常是变量
{
case数值1:
语句1;
break;
case数值2:
语句2;
break;
case数值3:
语句3;
break;
default :
语句4;
break;
}
解说:该结构把数值与数值1进行比较,若相等,则执行后面的所有语句,直到遇见break语句跳出整个循环,若前面的条件都不满足,则最终会执行default后面的语句。如果不写break语句,则后面的语句会接连执行,直到遇到break语句或者是全部语句执行完毕,只要前面的条件成立,则后面的判断就直接被忽略。
(2)switch使用注意
char c=‘A’;
switch(c)
{
case‘A’:
语句1;
break;
case 65://不能这样写,因为‘A’的ASCII值就是65,会报错
语句2;
break;
case数值3:
int a=10;
//a的作用域不明确报错,c语言检查变量的作用域根据{}决定,这里可以加{}
break;
default :
语句4;
break;
}
注意:如果要在case后面的语句中定义变量,则必须使用大括号包住。
(3)switch练习
输入一个整数seore代表分数,根据分数输出等级(A-E)。
A 90-100 B 80-89 C 70-79 D 60-69 E 0-60
1 #include<stdio.h>
2
3 int main()
4 {
5 // 定义一个变量score,用来存储用户输入的分数
6 int score ;
7
8 printf("请输入你的分数:");
9
10 scanf("%d",&score);
11
12 //用switch语句判断用户输入的分数是什么等级
13 switch (score/10) {
14 case 10://100分
15 case 9://90~99分
16 printf("等级是 A \n");
17 break;
18 case 8://80~89分
19 printf("等级是 B \n");
20 break;
21 case 7://70~79分
22 printf("等级是 C \n");
23 break;
24 case 6://60~69分
25 printf("等级是 D \n");
26 break;
27 default://0~59分
28 printf("等级是 E \n");
29 break;
30 }
31 return 0;
32 }
33
34
【对比】if与switch:
1. if语句能够完成的功能,switch有时并不能够完成,如判断if(a>100)
2. 在有些情况下,if语句和switch语句可以互换
3. switch语句能完成的功能,if语句都可以完成
(四)循环结构-while
(1)while结构
while(条件)
{
语句;
}
解说:判断条件是否成立,成立则执行(判断条件 -> 执行代码块 -> 判断条件 -> 执行代码块……)
1.首先确定循环执行的操作,2.在确定约束条件,即需要循环多少次,3.定义一个变量来记录循环的次数。
提示:在while循环体内使用if...break(跳出整个循环)或if...continue语句(跳出本次循环,继续下一次循环判断)。
while结构的运行原理:
①. 如果一开始条件不成立,则永远不会执行循环体。
②. 如果条件成立,则执行一次循环体,执行完毕后再次判断条件是否成立。
③. break:直接退出整个循环。
④. continue:结束当前循环体,进行下一轮循环判断。
(2)使用注意
1) while(1){.....}是一个死循环
2) while(a<10);{...}在条件后面加逗号表示循环体是一个空语句,而非{}部分
3) while条件语句后推荐使用{},否则只有第一条语句时循环体
4) 最简单的死循环 while(1);//永远执行空语句,让程序崩溃
(3)while练习
编程实现,提示输入一个正整数n,计算1+2+3+...n的值。
1 #include<stdio.h>
2
3 int main(){
4
5 //定义变量保存用户输入的整数
6
7 int n;
8
9 while(n<=0){
10
11 //提示输入
12
13 printf("请输入一个正整数:\n");
14
15 //接受输入
16
17 scanf("%d",&n);
18
19 }
20
21 int sum=0;
22
23 int number=0;//默认被加的数值
24
25 while(number<n){
26
27 number++;
28
29 sum=sum+number;
30
31 }
32
33 printf("计算结果为:%d\n",sum);
34
35 return 0;
36
37 }
(五)循环结构-do while
do
{
语句
}while(条件)
特点:do while循环至少会执行一次循环体
(六)循环结构-for
(1)基本使用
for(语句1,条件,语句2)
{
循环体
}
语句1:一般为初始化语句
语句2:一般为增量语句(执行完循环体后再执行的语句)
for循环原理:
1) for循环一开始就会执行语句1(整个for循环只会执行一次)
2) 判断条件是否成立,若成立,则执行一次循环体,然后执行语句2,再次判断条件是否成立,若条件不成立则结束循环
3) 顺序为:(语句1 -> 判断条件 -> 循环体 -> 语句2 -> 判断条件 -> 循环体……)
【对比】for和while:
在性能上,for循环稍胜一筹,因为while循环只能使用外部的变量,而for循环可以对变量进行及时回收。
(2)for使用注意
①. 不要随便在for语句后面写上分号,如for();{....}
②. 定义变量的作用域不明确错误
for(int i = 0;i < 5;i++)
int a = 10; //编译器报错,变量作用域不明确
③. for语句中最简单的死循环for(;;);
④. 需要注意变量定义的作用域
int a = 10;
for(int i = 0,int a = 9;i < 5;i++)
{
int a = 10;
printf(“a = %d\n”,a);//这里打印的a的值是多少?
}
(3)for循环嵌套
用以输出特定格式的内容,如QQ好友列表等,提升可扩展性。
for(in i = 0;i < 5;i++)
{
//外面的循环控制行数
printf(“好友列表%d\n”,i);
//内部的循环控制列数
for(int j = 1;j< = 6;j++)
{
printf(“好友%d\n”,j);
}
}
(4)for练习
使用for循环输出九九乘法表。//先控制行数,在控制列数
代码:
1 #include<stdio.h>
2
3 int main()
4
5 {
6
7 for(int i=1;i<=9;i++)
8
9 {
10
11 for(int j=1;j<=i;j++)
12
13 {
14
15 printf("%dx%d=%d\t",i,j,i*j);
16
17 }
18
19 printf("\n");
20
21 }
22
23 return 0;
24
25 }
「C」 函数、运算、流程控制的更多相关文章
- MySQL--视图view、触发器trigger、事务(start transaction)、存储过程(特殊的数据逻辑处理函数)、流程控制(if,case....)
mysql致力于项目开发及数据库管理之间解耦合(帮忙封装一些数据处理方法,使应用程序的开发者可以专注于应用程序的开发),但受限于不同部门沟通的成本问题,现阶段直接使用的价值不大. 一.视图(只能sel ...
- 14 MySQL--事务&函数与流程控制
一.事务 事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性. 一堆sql语句:要么同时执行成功,要么同时失败 # 事务的原子性 场景: ...
- mysql:视图、触发器、事务、存储、函数、流程控制
阅读目录 一 视图 二 触发器 三 事务 四 存储过程 五 函数 六 流程控制 回到顶部 一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只 ...
- Generator函数在流程控制中的应用
扯蛋 做了两年的Nodejs全栈开发,不知道为什么跑来做游戏呢(大概是厦门nodejs不好找工作吧).用的是网易的pomelo的游戏框架.现接手了一个棋牌游戏:二十一点,不懂的规则的可以自行百度. 二 ...
- [MySQL数据库之Navicat.pymysql模块、视图、触发器、存储过程、函数、流程控制]
[MySQL数据库之Navicat.pymysql模块.视图.触发器.存储过程.函数.流程控制] Navicat Navicat是一套快速.可靠并价格相当便宜的数据库管理工具,专为简化数据库的管理及降 ...
- MySQL知识补充(表字段操作、视图、触发器、事物、存储过程、内置函数、流程控制、索引、慢查询)
今日内容概要 表字段操作补充(掌握) 视图(了解) 触发器(了解) 事务(掌握) 存储过程(了解) 内置函数(了解) 流程控制(了解) 索引(熟悉) 内容详细 1.表字段操作补充 # 1.添加表字段 ...
- JavaScript 基础(数据类型、函数、流程控制、对象)
一.JavaScript概述 1.1 JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名Script ...
- mysql基础教程(四)-----事务、视图、存储过程和函数、流程控制
事务 概念 事务由单独单元的一个或多个SQL语句组成,在这 个单元中,每个MySQL语句是相互依赖的.而整个单独单 元作为一个不可分割的整体,如果单元中某条SQL语句一 旦执行失败或产生错误,整个单元 ...
- Mysql-自带的一些功能,基本用法(视图,触发器,事务,存储过程,函数,流程控制)
一. 视图 二. 触发器 三. 事务 四. 存储过程 五. 函数 六. 流程控制 一 .视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用 ...
随机推荐
- HDOJ-ACM Steps
在这里放几道Steps里的题目把. find your present (2) Time Limit: 1000/2000 MS (Java/Others) Memory Limit: 32768/1 ...
- 重拾javascript动态客户端网页脚本
笔记一: 一.DOM 作用: · DOM(Doument Object Model) 1.document文档 HTML 文件 (标记语言) <html> < ...
- 类比的方法学习Performance_schema
引用自:http://www.javacoder.cn/?p=332 MySQL在5.6版本中包含了一个强大的特性——performance-schema,合理的使用这个数据库中的表,能为我们解决一些 ...
- Windows Server 2012 R2 Standard序列号
备用一个吧,免得用起来的时候找不到. NB4WH-BBBYV-3MPPC-9RCMV-46XCB
- Maven项目 Spring 单元测试
使用maven创建web工程,将Spring配置文件applicationContext.xml放在src/resource下,用eclipse编译时提示class path resource [ap ...
- Uber到底挣钱不挣钱,听听司机怎么说
“根本不挣钱.”Joel开着他崭新的丰田凯美瑞混合动力车,在硅谷早晨的濛濛细雨中,不无幽怨地说.Joel是一名Uber司机,从坐上他车的那一刻起,他的抱怨便一直没停过:“过去日子还挺好过,一个月靠开U ...
- android项目 之 记事本(12) ----- 图片的等比例缩放及给图片加入边框
本文是自己学习所做笔记.欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 在Android的UI开发中常常会遇到图片的缩放,就比方记事本,如今的图片都比較 ...
- 联想S720/S720i通刷刷机包 Vibe V1.0
ROM介绍 基于官方最新S116底包制作,保证足够的稳定性. 增加VIBE元素,看起来更加大气.美观. 首次增加VIBE元素,720i执行起来无压力,720可能会有点卡.自行酌情刷入. 有bug请文明 ...
- connot find one or more components. please reinstall the application
正在用 Visual Studio 2013 写程序,程序一直执行正常. 此时,手动把注册表"HKEY_USERS"的当前用户的权限删除.再运行程序会提示:“是否继续并运行上次的成 ...
- ES配置详解
elasticsearch的config文件夹里面有两个配置文件:elasticsearch.yml和logging.yml,第一个是es的基本配置文件,第二个是日志配置文件,es也是使用log4j来 ...