C语言入门-学习笔记(不定时更新)

一、C语言基本内容

C语言( 面向过程的语言 )的特点:

  1. 语言简洁,紧凑,使用方便,灵活
  2. 运算符丰富
  3. 数据类型丰富
  4. 具有结构化的控制语句
  5. 语法限制不太严格,程序设计自由度大。
  6. C语言允许直接访问物理地址,能进行位(bit)操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作。
  7. 用C语言编写的程序可移植性好。
  8. 生成目标代码质量高,程序执行效率高 

Hello,World

相信每一位学习编程语言的朋友,对Hello World这两个单词应该都不陌生,这两个单词在程序员的世界里其实是一个非常著名的程序,它几乎是每一门编程语言中的第一个示例程序,也是程序员们学习编程的第一步。

#include <stdio.h>

main(){
    printf("Hello,World!");
    return 0;
} 

标识符命名规范

在程序中使用的变量名、函数名、宏名等统称为标识符。
除库函数的函数名由系统定义外,其余都由用户自定义。C 规定,标识符只能是字母(A~Z,a~z)、数字(0~9)、下划线( _ )组成的字符串,并且其第一个字符必须是字母或下划线
需要注意:
  1. 标识符不能和 C 语言的关键字相同,也不能和用户自定义的函数或 C 语言库函数重名。
  2. 不同的 c 语言编译器对标识符的长度规定不同,例如在某版本 C 中规定标识符前八位有效,当两个标识符前八位相同时,则被认为是同一个标识符。 (vc ++ 6.0 中规定标识符最长不允许超过 32 个字符)
  3. 标识符严格区分大小写,例如 int 和 Int,int 是关键字,而 Int 是用户定义的标识符

 C语言中的关键字

auto                             break                        case                        char                        const
continue                      default                       do                          double                     else
enum                           extern                        float                        for                           goto
if                                    inline                         int                          long                        register
restrict                          return                        short                       signed                    sizeof
static                             struct                        switch                     typedef                   union
unsigned                       void                          volatile                    while                       _bool
_Complex                       _Imaginary

注释 

注释是写给程序员看的。

有两种方法:

单行注释: // 注释一行

多行注释: /* 注释内容 */

C语言程序的执行 

  • 编译源程序 .C
  • 编译  检查语法错误  .obj
  • 链接  将多个目标程序链接到一个程序中  .exe

二、变量和数据类型 

基本数据类型及取值范围 

C 语言提供 5 种基本数据类型。
  1. 字符型:用 char 表示。
  2. 整数型:用 int 表示。
  3. 单精度实数型:用 float 表示。
  4. 双精度实数型:用 double 表示。
  5. 空类型:用 void 表示

 数据类型的长度和取值范围会随着机器的 CPU 类型和编译器的不同而不同。但是 char 就是1 字节,固定不变。

 标识符、变量和常量

1. 变量

其值可以改变的量称为变量。C语言规定:变量必须在使用之前定义。

  • 变量定义的一般形式是:<类型名>  <变量列表>;

如:

int i, j, number;
unsigned int max, min;
float high_value, price;
double lenth, total_wieight;

2. 常量

常量的值是不可变的。在 C 语言中,有整型常量、实型常量、字符常量、字符串常量、和枚举常量等。

  • 整型常量

可采用十进制、八进制、十六进制来表示整型常量。

八进制数的前面用数字 0 开头

十六进制数的前面用数字 0 和字母 X 开头(0x 或 0X)

  • 实型常量

两种表示法:浮点计数法和科学计数法

例如:

            231.46

            7.36E-7

            4.58E5

            -0.0945

对于太大或太小的数,通常是采用科学计数法

  • 字符常量 
字符常量是由一对单引号括起来的单个字符。
如:'A'、'S'、'9'、'$' 等均为字符常量。
注意:
1. 单引号只起定界作用,并不代表字符。
2. 单引号 (')和反斜杠(\)本身作为字符时要通过转义字符(\)。
   如:'\''和 '\\' 分别代表单个字符 单引号(')和反斜杠(\)。 
  • 字符串常量 
字符串常量是指用一对双引号括起来的一串字符。
如:
"world", "TRUE or FLASE", "8765431.0037", "T " 均为字符串常量。
注:双引号 (")和反斜杠(\)本身作为字符串时要通过转义字符(\)。
如: " \ " "和 " \\ " 分别代表字符串(")和反斜杠(\)。

注意字符常量与字符串常量的区别: 

  在 C 语言中,字符串常量在内存中存储时,系统自动在字符串的末尾加一个 “串结束标志”:\0
该结束标志的 ASCⅡ 码值为 0,字符为空 NULL。
因此,长度为 n 个字符的字符串常量,在内存中占有n+1个字节的存储空间。
如:字 符串“ World ”,共5个字符,需占用6个字节,其存储形式为:
World\0

转义字符

转义字符用反斜杠\后面跟一个字符或一个八进制或十六进制数表示。
如:\a,\0,\n等。
注意:
① 转义字符中的字母只能是小写字母,每个转义字符只能看作一个字符。
② 在程序中,使用不可打印字符时,通常用转义字符表示。

    6)符号常量

将程序中的常量定义为一个标识符,称为符号常量。
符号常量在使用前必须先定义,定义的形式是: #define <符号常量名> <常量>
如:#define PI 3.1415926
#define TRUE 1
#define FALSE 0
其中PI、TRUE、FLASE均为符号常量;
其值分别为3.1415926,1,0。
注1: #define是C语言的预处理命令;
注2:习惯上符号常量用大写英文字母表示。

基本运算符、表达式及运算的优先级 

C语言的基本表达式是由操作数和操作符组成。
  •  操作数通常由变量或常量表示;
  • 操作符由各种运算符表示。
  • 一个基本表达式也可以作为操作数来构成复杂表达式。
构成基本表达式的常用运算符有:
  1. 算术运算符。
  2. 关系运算符。
  3. 逻辑运算符。
  4. 赋值运算符。
另外,条件运算符、自反赋值运算符、逗号运算符、指针运算符、位运算符等
均可构成基本表达式。
    1.算术运算符及算术表达式
算术运算符主要用于完成变量的算术运算。
如:加、减、乘、除等。各运算符及其作用如下:
运算符优先级作用
++高(14)自增1
--自减1
+低(12)加法
-减法
*中(13)乘法
/除法
%模运算(整数相除,结果取余)
关于前置 ++/−− 和后置 ++/−− 的作用

前置++或前置−−表达式:

++<变量>; ➔ 先将变量的值加1,再使用变量。

−−<变量>; ➔ 先将变量的值减1,再使用变量。

后置++或后置−−表达式:

<变量>++; ➔ 先使用变量,再将变量的值加1。
<变量>−−; ➔ 先使用变量,再将变量的值减1。

     2. 关系运算符及关系表达式

关系运算符的作用:用于条件判断的表达。
关系运算符及其含义和优先级如下:
关系运算符含义优先级
<小于高(10)
>大于
==等于低(9)
!=不等于
<=小于等于高(10)
>=大于等于
关系表达式的结果只有两个:
(1) 真(值为1)
(2) 假(值为0)
    3. 逻辑运算符及逻辑表达式
逻辑运算符的作用:用于判断条件中的逻辑关系。
逻辑运算符及其含义和优先级如下:
逻辑运算符含义优先级
逻辑非高(14)
&&逻辑与中(5)
||逻辑或低(4)
逻辑表达式的结果:
真(值为1)
假(值为0)
  • (表达式1) || (表达式2)
语法规则
若:(表达式1)的值为真,
则:(表达式1) || (表达式2)的结果就为真。
  • (表达式1) && (表达式2)
语法规则
若:(表达式1)的值为假,
则:(表达式1) && (表达式2)的结果就为假
#include<stdio.h>
main()
{ 
int a=4,b=8,c=5;
int d1,d2,d3,d4;
d1=(a<b)||(++a==5)||(c>b--); /* 表达式(1) */
printf("d1=%d, a=%d, b=%d, c=%d\n",d1,a,b,c);
d2=(a>b)&&(++a==5)||(c>b--); /* 表达式(2) */
printf("d2=%d, a=%d, b=%d, c=%d\n",d2,a,b,c);
d3=(a<b)||(++a==5)&&(c>b--); /* 表达式(3) */
printf("d3=%d, a=%d, b=%d, c=%d\n",d3,a,b,c);
d4=(a>b)&&(++a==5)&&(c>b--); /* 表达式(4) */
printf("d4=%d, a=%d, b=%d, c=%d\n",d4,a,b,c);
}

结果:

    4. 位运算符及表达式

位运算的作用:直接对变量的二进制按位进行操作。
注意:位运算只适合于整型和字符型变量
位运算符及其含义和优先级如下:
位运算符含义优先级
~按位取反高(14)
&位与低(8)
^位异或低(7)
|位或低(6)
<<位左移中(11)
>>位右移

位运算规则:

ABA|BA^BA&B~A~B
1110100
1011001
0000011
0111010

    5. 条件运算符

条件运算符由“?”和“:”组成。
条件表达式的一般形式:
表达式1? 表达式2:表达式3;
条件表达式的语法规则:
当表达式1的值为1(真)时,其结果为表达式2的值;
当表达式1的值为0(假)时,其结果为表达式3的值。
注意:
表达式1通常是关系表达式或逻辑表达式,也可以是其他表达式。
条件运算符 又称为三目运算符,“三目”指的是操作数的个数有3个。
#include <stdio.h>
#include <stdlib.h>
main()
{
int a=3,b=5,c;
c=(a>b)?(a+b):(a-b);
printf("The max value of a and b is: %d\n",c);
a=6;
b=2;
c=(a>b)?(a-b):(a+b);
printf("The max value of a and b is: %d\n",c);
}

    6. 逗号表达式 

由逗号运算符“,”将两个表达式连接起来: 表达式1,表达式2;
逗号表达 式的语法规则: 先计算 表达式1,再计算表达式2; 最后结果为表达式2的结果。
注意:
1.逗号表达式可以扩充到具有 n 个表达式的情况:
表达式1,表达式2,…,表达式 n 整个逗号表达式的结果为表达式n的值。
2.通常是用逗号表达式来分别求逗号表达式内各表达式的值,并不是为了求整
个逗号表达式的值。
3.变量定义中出现的逗号和在函数参数表中出现的逗号不构成逗号表达式。
4.逗号表达式有可能降低程序的可读性,请谨慎使用。
    7. 数据类型的转换
1. 系统自动转换
容易出现意外结果。
假设有:
int a=6, b;
float t=0.7, s;
s=a+t;
b=a+t;
结果为:s=6.7,b=6,
原因:数据类型不一致,有可能产生数据丢失。
应避免出现数据类型不一致的表达式。
2.强制转换数据类型
强制转换表达式:
(数据类型符)表达式; 或: (数据类型符)变量;
强制转换语法规则:
将表达式或变量的值临时转换成圆括号内指定的数据类型。但不改变变量原来的数据类型。
假设有:
int a ;
float t ;
a=15;
t=(float) a/30;
结果为: t=0.5,
若表达式为t=a/30,则结果为:t=0。  

标准输入/输出函数简介

C语言的输入/输出的操作是通过调用系统函数来实现。
常用的标准输入/输出函数有如下几种。
(1)格式化输入/输出函数:scanf()/printf()。
(2)字符输入/输出函数:getc()/putc()。
(3)字符输入/输出函数:getch()/putch()。
(4)字符输入/输出函数:getchar()/putchar()。
(5)字符串输入/输出函数:gets()/puts()。
不同的函数在功能上有所不同,使用时应根据具体的要求,选择合适的输入/输出函数。
字符 “ * ”
  * 号的作用:跳过相应的数据。输入的数据不赋给变量。
(这个是上课期间没有了解到的,要了解一下!)
假如有:
int x=0,y=0,z=0;
scanf("%d%*d%d",&x, &y, &z);
若输入为:11 22 33
则结果为:x=11,y=33,z=0
(z保持原来的值不变,22被跳过,没有赋给任何变量。)

三、结构化程序的算法设计 

结构化算法的性质及结构

1.  结构化算法性质
  • 算法名称 给算法命名,是为了方便算法的描述,在C语言中,算法的名字通常就是函数名。
  • 输入 算法应有输入的数据或初始条件。
  • 输出 算法通常会有一个或多个输出,是对输入数据加工后的结果。
  • 有效性 算法的每一步都是可执行的,可通过人工计算的。
  • 正确性 算法的结果必须是正确的,可验证的。
  • 有限性 任何算法必须在执行有限条指令后结束。

2.  结构化算法的结构

    1)顺序结构
    顺序结构的特点:
        程序在执行过程中是按语句的 先后顺序 来执行的,每一条语句都代表着一个功能,
    2)分支结构
    分支结构的特点:
        程序在执行过程中,会根据条件的不同 有选择的执行 不同的功能。
    3)循环结构
    循环结构的特点:
        程序在执行过程中,在一定的时间段内或一定的条件下, 重复地执行 某个功能,直到时间已到或条件不再满足。

四、选择结构

1. if 结构

if语句的一般形式为:
    if(<表达式>)
       <语句A>
语法功能:
先判断<表达式>的值,若该值为“真”,
则:执行<语句A>;
否则:什么也不执行。
注意:
1. <表达式>:一般为条件表达式或逻辑表达式。
2. if语句中的<语句A>一般情况下都是以复合语句的形式出现,即用一对花括号将语句括起来。如果语句只有一条,则可以不需要花括号。
3. if结构的流程图 :

#include <stdio.h>
main()
{
    int a=1,b=2;
	if(a>b)
	printf("a>b,a=%d",a);
	if(a<b)
	printf("b>a,b=%d",b); 
}

 2.  if else 语句

if_else语句的一般形式为:
    if(<表达式>)
        <语句A >
    else
        <语句B>
式中<表达式> ,一般为条件表达式或逻辑表达式。
语法功 能:
先判断<表达式>的值,若其值为“真”,
则执行<语句A>,否则执行<语句B>。
注意:
结构中的<表达式>、<语句A>与<语句B>的规定同if结构。
if_else结构的流程图如图所示:

#include <stdio.h>
main()
{
    int a=1,b=2;
	if(a>b)
	printf("a>b,a=%d",a);
	else 
	printf("b>a,b=%d",b); 
}

 3. if 语句的嵌套

    if(<表达式1> )
        <语句1> 
    else if(<表达式2>)
       <语句2> 
    else if (<表达式3>)
       <语句3>
        …
    else if (<表达式n>)
        <语句n>
    else
        <语句n+1>
#include <stdio.h>
main()
{
    int a=2,b=2;
	if(a>b)
	printf("a>b,a=%d",a);
	else if(a<b)
	printf("b>a,b=%d",b); 
	else
	printf("a=b=%d",a);
}

 4. switch 结构

switch语句的一般形式为:
    switch(<表达式>)
    {
        case<常量表达式1>:语句序列1;
        case<常量表达式2>:语句序列2;
        …
        case<常量表达式n>:语句序列n;
        default:语句序列(n+1);
    }
注意:
(1) <常量表达式i>的值必须是整型、字符型或者枚举类型;
(2) 语句序列i允许有多条语句,不需要将语句序列用一对花括号括起;
(3) <表达式>可以为任何表达式。
(4) switch语句的语法规则是:
①先计算<表达式>的值;
②再依次判断与哪一个<常量表达式i>的值相等;
③若<表达式>的值等于<常量表达式i>的值,
④则:从语句序列i开始执行语句,直到语句序列(n+1)为止;
⑤若<表达式>的值不等于任何一个<常量表达式i>的值,
⑥则:执行default后面的语句序列(n+1)。
(5) switch语句一般形式的流程图如图所示:

例: 某班级准备周末举行一个班级活动,但活动内容要根据表中所示的天气情况来决定:
天气活动内容
晴天登山
有风无雨郊游
下雪堆雪人
下雨不举行班级活动
其他天气参观博物馆
分析:
①分别用整数1、2、3、4代表晴天、有风无雨、下雪和下雨这4种天气情况。
②通过输入天气情况weather的值,来确定活动场所。
#include <stdio.h>
main()
{
    printf("请输入天气:1--晴天,2--有风无雨,3--下雪,4--下雨\n");
	int num;
	scanf("%d",&num);
	switch (num){
	case 1:printf("登山\n");
	case 2:printf("郊游\n");
	case 3:printf("堆雪人\n");
	case 4:printf("不举行班级活动\n");
	default:printf("其他天气\n");
	} 
}

break语句在switch语句中的作用
    break语句起中断和跳出的作用。
    可以用在switch分支语句和循环语句中。
使用方法:
在switch语句中,在需要独立执行的<语句序列i>后面加上一条分支语句:break;
switch条件分支互相独立的语句形式为:
    switch (<表达式>)
    {
        case <常量表达式1>: <语句序列1>;
        break;
        case <常量表达式2>: <语句序列2>;
        break;
        case <常量表达式i>: <语句序列i>
        break;
        …
        case <常量表达式n>: <语句序列n>;
        break;
        default: <语句序列n+1>;
    }
#include <stdio.h>
main()
{
    printf("请输入天气:1--晴天,2--有风无雨,3--下雪,4--下雨\n");
	int num;
	scanf("%d",&num);
	switch (num){
	case 1:printf("登山\n");break;
	case 2:printf("郊游\n");break;
	case 3:printf("堆雪人\n");break;
	case 4:printf("不举行班级活动\n");break;
	default:printf("其他天气\n");
	} 
}

  

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值