C语言速成

807 阅读10分钟

1.C语言简介

C 语言是一种计算机程序编辑语言,C语言不仅用于系统软件的开发,还广泛应用于嵌入式系统、游戏开发、网络编程等领域。

2.第一个C语言程序

#include <stdio.h>

int main(){
	printf("hello world");
	return 0;
}

#include <stdio.h>是在程序编译之前要处理的内容,称为编译预处理命令。编译预处理命令还有很多,它们都以“#”开头,并且不用分号结尾

main函数是程序的入口,一个工程中main函数有且仅有一个

printf 是⼀个库函数,库函数是为了⽅便程序员写代码的。库函数是由C语⾔给出标准后,由编译器⼚商提供的⼀组现成可直接使⽤的函数,这些函数⼀般是以静态库的⽅式提供的。

库函数的使⽤,需要包含对应的头⽂件,⽐如 printf 函数的使⽤,需要包含 stdio.h ,所以看代码的第1⾏,就是如下所⽰的头⽂件包含, #include 是预处理指令, <> 中是头⽂件的名字。注意:库函数的使⽤⼀定要包含对应的头⽂件,否则可能出现错误。

printf 就是⼀个C语⾔编译器提供的⼀个打印信息的函数,我们可以使⽤函数打印我们各种类型的数据,⽐如:

printf("%d\n", 100);
printf("%c\n", 'B');
printf("HELLO WORLD\n");

为了让光标移到下⼀⾏的开头,可以在输出⽂本的结尾,添加⼀个换⾏符 \n 。printf() 可以在输出⽂本中指定占位符。所谓 “占位符”,就是这个位置可以⽤其他值代⼊。

#include <stdio.h>
int main(){
  printf("There are %d apples\n", 3);
  return 0;
}

上⾯⽰例中, There are %d apples\n 是输出⽂本,⾥⾯的 %d 就是占位符,表⽰这个位置要⽤其他值来替换。占位符的第⼀个字符⼀律为百分号 % ,第⼆个字符表⽰占位符的类型, %d 表⽰这⾥代⼊的值必须是⼀个整数。

printf() 的第⼆个参数就是替换占位符的值,上⾯的例⼦是整数 3 替换 %d 。执⾏后的输出结果就是 There are 3 apples 。

占位符列举:

%c :字符

%d :⼗进制整数

%f :⼩数(包含 float 类型和 double 类型)。

练习:分析下列代码输出

#include <stdio.h>
int main(){
  int a  = 10;
  printf("There are %d apples\n", a);
  return 0;
}

3.数据类型

char  字符数据类型

int   整形

float  单精度浮点数

4.变量

⽣活中有很多的变化的值,⽐如:年龄、体重、薪资等,C语⾔则怎么描述这种变化的值呢?答案就是:变量。 变量可以存放数值,存放的数值也是可以根据需要修改的。

(1)变量的创建

image.png

如果变量在创建的同时,想给⼀个确定的值,这叫变量的初始化,如下:

int age = 20;

(2)变量的值可以改变

#include <stdio.h>
int main(){
 int age = 10;
 printf("%d\n", age);
 age = 20;
 printf("%d\n", age);
 return 0;
}

5.算术操作符

C语⾔中为了⽅便运算,提供了⼀系列操作符,其中有⼀组操作符叫:算术操作符,分别是:+ 、- 、*、/、%,都是双⽬操作符,有2个操作数

(1)+ 和 - ⽤来完成加法和减法。

image.png

(2)运算符 * ⽤来完成乘法。

image.png

(3)运算符 / ⽤来完成除法。

除号的两端如果是整数,执⾏的是整数除法,得到的结果也是整数。

#include <stdio.h>
int main(){
  int y = 6 / 4;
  printf("%d\n", y); // 输出 1
  return 0;
}

如果希望得到浮点数的结果,两个运算数必须⾄少有⼀个浮点数,这时 C 语⾔就会进⾏浮点数除法。

#include <stdio.h>
int main(){
  float x = 6.0 / 4; // 或者写成 6 / 4.0
  printf("%f\n", x); // 输出 1.500000
  return 0;
}

运算符 % 表⽰求模运算,即返回两个整数相除的余值。这个运算符只能⽤于整数,不能⽤于浮点数。

#include <stdio.h>
int main(){
  int x = 6 % 4; // 2
  return 0;
  }

image.png

(4)单⽬操作符:++、--

前⾯介绍的操作符都是双⽬操作符,有2个操作数的。C语⾔中还有⼀些操作符只有⼀个操作数,被称为单⽬操作符。++、-- 就是单⽬操作符的。

(5)赋值操作符

的作⽤就是在需要的时候,给变量⼀个值,⽐如:

#include <stdio.h>
int main(){
 int age = 10;
 printf("%d\n", age);
 age = 20;
 printf("%d\n", age);
 return 0;
}

(6)如果变量对⾃⾝的值进⾏算术运算,C 语⾔提供了简写形式,允许将赋值运算符和算术运算符结合成⼀个运算符叫做复合赋值符。

image.png

i += 3; // 等同于 i = i + 3
i -= 8; // 等同于 i = i - 8
i *= 9; // 等同于 i = i * 9
i /= 2; // 等同于 i = i / 2
i %= 5; // 等同于 i = i % 5

6.关系操作符和条件操作符

(1) 关系操作符

C 语⾔⽤于⽐较的表达式,称为 “关系表达式”(relational expression),⾥⾯使⽤的运算符就称为“关系运算符”(relational operator),主要有下⾯6个

image.png

image.png

关系表达式通常返回 0 或 1 ,表⽰真假。C语⾔中, 0 表⽰假,所有⾮零值表⽰真。⽐如, 20 > 12 返回 1 , 12 > 20 返回 0 。关系表达式常⽤于 if 或 while 结构。

注意:相等运算符 == 与赋值运算符 = 是两个不⼀样的运算符,不要混淆。

逻辑操作符:

&&逻辑与 ||逻辑或

7.if语句:if和else

C语⾔是结构化的程序设计语⾔,这⾥的结构指的是顺序结构、选择结构、循环结构,C语⾔是能够实 现着三种结构的,其实我们如果仔细分析,我们⽣活中常⻅的事情都可以拆分为这三种结构或者这三种结构的组合。在C语⾔中,我们可以使⽤ if 、 switch 实现分⽀结构,使⽤ for 、 while 、 do while 实现循环结构。

(1) if

if 语句的语法形式如下:

if ( 表达式 ){
  语句
}

表达式成⽴(为真),则语句执⾏,表达式不成⽴(为假),则语句不执⾏在C语⾔中,0为假,⾮0表⽰真,也就是表达式的结果如果是0,则语句不执⾏,表达式的结果如果不是0,则语句执⾏。

例:判断⼀个整数是否为奇数

int main(){
  int num = 0;
  scanf("%d", &num);
  if(num % 2 == 1)
    printf("%d 是奇数\n", num);
  return 0;
}

image.png

(2) else

如果⼀个数不是奇数,那就是偶数了,如果任意⼀个整数,我们使⽤C语⾔要清楚的判断是奇数还是偶数怎么编写代码呢?这⾥就需要 if...else... 语句了,语法形式如下:

image.png

#include <stdio.h>

int main(){
  int num = 0;
  if(num % 2 == 1)
    printf("%d 是奇数\n", num);
  else
    printf("%d 是偶数\n", num);
  return 0;
}

(3) if分⽀中包含多条语句

默认在 if 和 else 语句中默认都只控制⼀条语句,那如果我们要if语句同时控制2条语句,怎么办呢?那就要使⽤ {} 将代码括起来,else 后也可以跟上⼤括号。如下:

int a = 0;
if(a == 0){
  printf("是0");
  printf("还是0");
}else{
  printf("不是0");
  printf("还不是0");
}

练习:如果一个人的年龄小于18岁,为少年,大于等于18岁,小于30岁为青年,大于等于三十岁小于50岁为中年,用条件语句实现。

8.循环语句

我们已经掌握了,if语句:当条件满足的情况下,if语句后的语句执行,否则不执行。但是这个语句只会执行一次。由于我们发现生活中很多的实际的例子是:同一件事情我们需要完成很多次。那我们怎么做呢?

C语言中给我们引入了: while 语句,可以实现循环。

//while 语法结构
while(表达式)
  循环语句;//如果循环体想包含更多的语句,可以加上⼤括号

执⾏判断表达式,表达式的值为0,循环直接结束;表达式的值不为0,则执⾏循环语

句,语句执⾏完后再继续判断,是否进⾏下⼀次判断。

例:打印1-10循环

image.png

练习:打印2 4 6 8 10

while(0){}
while(1){}

for循环是循环语句中使⽤最多的,for循环的语法形式如下:

1 for(表达式1; 表达式2; 表达式3)

2 语句;//如果循环体想包含更多的语句,可以加上⼤括号

表达式1 ⽤于循环变量的初始化

表达式2 ⽤于循环结束条件的判断

表达式3 ⽤于循环变量的调整

练习1:用for循环在屏幕上打印1~10的值

练习2:计算1~100之间3的倍数的数字之和

思考:

  1. 怎么产⽣1~100之间数字
  2. 怎么挑出3的倍数的数字
  3. 求和

9.函数

数学中我们其实就⻅过函数的概念,⽐如:⼀次函数 y=kx+b ,k和b都是常数,给⼀个任意的x,y就 得到⼀个值。其实在C语⾔也引⼊函数(function)的概念。

C语⾔中的函数就是完成某项特定的任务的⼀⼩段代码。这段代码是有特殊的写法和调⽤⽅法的。⽐如: 我们学习过的、printf都是函数,这些函数是现成的库函数。函数也可以⾃⼰设计和实现,称为⾃定义函数。

函数的优势:

  1. 分解任务;C语⾔的程序其实是由⽆数个⼩的函数组合⽽成的,也可以说:使⽤函数可以把⼤的计

算任务分解成若⼲个较⼩的函数(对应较⼩的任务)完成。

  1. 代码复⽤;⼀个函数如果能完成某项特定任务的话,这个函数也是可以复⽤的,提升了开发软件的

效率。

在C语⾔中我们⼀般会⻅到两类函数:

•库函数:C语⾔的国际标准ANSI C规定了⼀ 些常⽤的函数的标准,被称为标准库,这些函数已经是现成的,我们只要学会使⽤就能直接使⽤了,只要包含函数需要的头⽂件即可。

•⾃定义函数:库函数再好,提供的功能还是有限的;⽇常写代码的需求是千变万化的,所以还是需要程序员写各种 各样的代码,这些代码也是由⼀个个函数组成,我们⾃⼰设计和实现的函数就是⾃定义函数。

int sqrt (int x)
{

}

函数返回类型 函数名 (参数1,参数2)
{
   函数体
}

image.png 我们可以把函数想象成⼩型的⼀个加⼯⼚,⼯⼚得输⼊原材料,经过⼯⼚加⼯才能⽣产出产品,那函

数也是⼀样的,函数⼀般会输⼊⼀些值(可以是0个,也可以是多个),经过函数内的计算,得出结

果。

函数定义:

函数返回类型 函数名 (参数1类型 参数1,参数2类型 参数2)
{
   return (可选)
}

其中 函数返回类型可以是void 表示什么也不返回。

函数的参数就相当于,⼯⼚中送进去的原材料,函数的参数也可以是void,明确表⽰函数没有参数。如果有参数,要交代清楚参数的类型和名字。

例:写⼀个加法函数,完成2个整型变量的加法操作。

思考:(1)函数返回类型(2)函数名 (3)函数参数

例2:分析主函数

int main(void){
 
 return 0;
}

例3:设计一个函数打印一个整数值

函数调用:

函数名(参数1,参数2);

函数声明:告诉编译器我要实现一个函数,但是现在不想实现

函数返回类型 函数名 (参数1类型 参数1,参数2类型 参数2)

⼀般在企业中我们写代码时候,代码可能⽐较多,不会将所有的代码都放在⼀个⽂件中;我们往往会根据程序的功能,讲代码拆分放在多个⽂件中。⼀般情况下,函数的声明、类型的声明、常量的定义是放在头⽂件(.h)中,函数的实现是放在源⽂件(.c)⽂件中。

如下:

add.c

//函数的定义
int Add(int x, int y)
{
  return x+y;
}

add.h

函数的声明
int Add(int x, int y);

test.c

#include <stdio.h>
#include "add.h"
int main(){
  int a = 10;
  int b = 20;
  int c = Add(a, b);
  printf("%d\n", c);
  return 0;
}