C语言基础知识

目录

一、什么是C语言

1.1 C源程序的结构特点

二、数据类型及数据类型大小

2.1数据类型的大小

三、变量、常量、标识符

3.1 变量

3.2 常量

四、顺序语句、选择语句、循环语句

4.1 选择语句

 4.2 循环语句

 4.3 无限循环

五、函数

六、数组

 6.1 运算符

6.1 在讲解具体运算符之前,介绍几个与之相关的术语

6.2 运算符举例

七、指针 

八、结构体

九、关键字

9.1、数据类型关键字

9.2、流程控制关键字

9.3、C99新增(五个)

9.4、sizeof 计算类型的大小或变量的大小,也就是字节个数。

9.5、typedef  关键字

9.6、extern  关键字 

9.7. static  关键字

9.8、const  关键字


一、什么是C语言

C语言是一门面向过程、抽象化的通用程序设计语言,广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。尽管C语言提供了许多低级处理的功能,但仍然保持着跨平台的特性,以一个标准规格写出的C语言程序可在包括一些类似嵌入式处理器以及超级计算机等作业平台的许多计算机平台上进行编译。

//第一个C语言程序
#include <stdio.h>
int main()
{
    printf("Hello World!\n");
    retutn 0;
}

1.1 C源程序的结构特点

1.一个C语言源程序可以由一个或多个源文件组成。

2.每个源文件可由一个或多个函数组成。

3.一个源程序不论由多少个文件组成,都有一个且只能有一个main函数,即主函数。

4.源程序中可以有预处理命令(include 命令仅为其中的一种),预处理命令通常应放在源文件或源程序的最前面。

5.每一个说明,每一个语句都必须以分号结尾。

6.标识符,关键字之间必须至少加一个空格以示间隔。若已有明显的间隔符,也可不再加空格来间隔。
 


二、数据类型及数据类型大小

我们在编写C语言程序时,会遇到十种数据类型。即:

整型(五种):char、short、int、long int、long long

浮点型(三种):float、double、long double

还有布尔类型(bool)和无类型(void)

2.1数据类型的大小

在此处我们使用sizeof关键字来计算数据类型所占字节个数

由于void无法计算字节大小,所有我们在此没有进行计算

#include <stdio.h>
int main()
{
    printf("char size:        %d \n", sizeof(char));
	printf("short size:       %d \n", sizeof(short));
	printf("int size:         %d \n", sizeof(int));
	printf("long int size:    %d \n", sizeof(long int));
	printf("long long size:   %d \n", sizeof(long long));
	printf("float size:       %d \n", sizeof(float));
	printf("double size:      %d \n", sizeof(double));
	printf("long double size: %d \n", sizeof(long double)); 
    printf("bool size:        %d \n",sizeof(bool));
    return 0;
}

运行代码得到如下结果,但要注意的是,部分类型在不同编译器或不同系统上的字节大小不同,我在这里使用的是vs2019


三、变量、常量、标识符

变量是以某标识符为名字,其数值可以改变(可读,可写)。{可读(获取,可取值),可写(赋值)}

常量其值不可改变(只可读,不可写)。

什么是声明,什么是定义?

什么是定义:所谓的定义就是为这个变量分配一块内存并给它取上一个名字,这个名字就是我们

常所说的变量名。但注意,这个名字一旦和这块内存匹配起来,它们就同生共死,终生不离不弃

并且这块内存的位置也不能被改变。一个变量在一定的区域内(比如函数内,全局等)只能被定

一次,如果定义多次,编译器会提示你重复定义同个变量或对象。

什么是声明:有两重含义,如下:

第一重含义:告诉编译器,这个名字已经匹配到一块内存上了。

第二重含义:告诉编译器,我这个名字我先预定了,别的地方再也不能用它来作为变量名。

记住,定义和声明最重要的区别:定义创建了对象并为这个对象一块内存,而声明的时候是没有

配内存空间的.

示例:

3.1 变量

1.局部变量:在函数中定义的变量。

2.全局变量:在函数外定义的变量。

 

3.2 常量

c语言的常量分为:
1.字面常量

2.用#define定义的宏常量

3.用const关键字修饰的变量,称为常变量

4.枚举常量

5.字符常量和字符串常量

示例 1:字面常量、宏常量、常变量、枚举常量

 示例 2:

示例 3:字符常量、字符串常量

单引号是字符的定界符: 

双引号是字符串的定界符:

 

转义字符以反斜线"\"开头,后跟一个或几个字符。转义字符具有特定的含义,不同于字符原有的意义,故称“转义”字符。

使用转义字符时需要注意下问题:

1)        转义字符只能使用小写字母,否则转义字符被忽略;  如’\N’  ->   ‘N'。

2)         \v  垂直制表和  \f  换页符对屏幕没有任何影响,只会影响打印机执行响应操作。

3)        \t  光标向前移动四格或八格编译器里设置

4)        \'  字符里(即单引号里)使用字符串里(即双引号里)需要只要用  ′  即可

5)        \?  其实就是?(没有转义字符也一样,在vs2012测试过)
 

转义符可以把字符转义为其它意义,还可以把定界符和转义符转换为字符意义;
如:   ' \' '   ->  '
       ' \\ '   ->  \

示例 1:

 示例 2:

  示例 3:

 示例 4:

 示例 5:

总结:

转义字符既可以用于单个字符,也可以用于字符串,并且一个字符串中可以同时使用八进制形式

十六进制形式。转义字符的初衷是用于ASCII编码,所以它的取值范围有限:

1.八进制形式的转义字符最多后跟三个数字,也即  \ddd  最大取值是 \177

2.十六进制形式的转义字符最多后跟两个数字,也即 \xdd 最大取值是 \x7f

单引号、双引号、反斜杠是特殊的字符,不能直接表示:

1.单引号是字符类型的开头和结尾,要使用\’也即’\’'

2.双引号是字符串的开头和结尾,要使用 \” 表示,也即" abc\”123\” tulun"

3.反斜杠是转义字符的开头,要使用 \\ 表示,也即  '\\’  或者  “tulun\\1024"
 


四、顺序语句、选择语句、循环语句

1.顺序结构︰按照语句出现的先后顺序依次执行;

2.选择结构︰根据条件判断是否执行相关语句;

3.循序结构︰当条件成立时,重复执行某些语句;

4.1 选择语句

示例:

 4.2 循环语句

示例:

 4.3 无限循环

while (1) {}

for ( ; ; ) {}

五、函数

通过函数,可以把一个复杂任务分解成为若干个易于解决的小任务。充分体现结构化程序设计由

粗到精,逐步细化的设计思想。

就像是我们要制作如下的一个图书管理系统,就需要层层分解需求,将一个系统分为一个个小功能。

 示例:知道三条边用海伦公式求三角形面积

#include<stdio.h>
#include<math.h>
int main()
{
	float a = 0.0f, b = 0.0f, c = 0.0f, p = 0.0f;
	float s = 0.0f;
	scanf("%f %f %f", &a, &b, &c);
	p = (a + b + c) / 2;
	s = sqrt(p * (p - a) * (p - b) * (p - c));
	printf("s = %f \n", s);
	return 0;
}

改为函数封装:

#include<stdio.h>
#include<math.h>

int TriangleArea(float a, float b, float c)
{
    float p = (a + b + c) / 2;
	float s = sqrt(p * (p - a) * (p - b) * (p - c));
    return s;
} 
int main()
{
	float a = 0.0f, b = 0.0f, c = 0.0f;
	float area = 0.0f;
	scanf("%f %f %f", &a, &b, &c);
    area = TriangleArea(a, b, c);
	printf("area = %f \n", area);
	return 0;
}

5.1 可见性(作用域)和生存期

作用域(可见性)指标识符能够被使用的范围;只有在作用域内标识符才可以被使用。

此阶段针对编译和链接过程。

1)函数中定义的标识符,包括形参和函数体中定义的局部变量,作用域都在该函数内,也称作函数域。

2)文件作用域也称全局作用域。定义在所有函数之外的标识符,具有文件作用域,作用域为从定义处到
整个源文件结束。文件中定义的全局变量和函数都具有文件作用域。

生存期也叫生命期(Life time)。此阶段针对的是程序的执行过程。

生命期指的是标识符从程序开始运行时被创建,具有存储空间,到程序运行结束时消亡,释放存储空间的时间段。

1)局部变量的生存期是:函数被调用,分配存储空间,到函数执行结束,存储空间释放。存储.stack区

2)全局变量的生存期是:从程序行前开始,到执行后结束。存储在.data区

3)动态生命期是:标识符由特定的函数调用或运算来创建和释放,如调用malloc()为变量分配存储空
间,变量的生命期开始,而调用free()释放空间或程序结束时,变量生命期结束。具有动态生命期的变量存储在堆区.heap。


六、数组

数组是包含给定类型的一组数据,即一组相同类型的集合。

示例:

 6.1 运算符

C语言运算符优先级表

C语言运算符优先级表
优先级运算符名称或含义使用形式结合方向说明
1

[ ]

数组下标数组名[常量表达式]从左到右
()圆括号表达式/函数名(形参表)
.成员选择(对象)对象.成员名
->成员选择(指针)对象指针.成员名
2-

负号运算符

- 表达式从右到左单目运算符
(类型)强制类型转换(数据类型)表达式
++自增运算符++变量名/变量名++单目运算符
- -自减运算符- -变量名/变量名- -单目运算符
*取值运算符*指针变量单目运算符
&取地址运算符&变量名单目运算符
!逻辑非运算符!表达式单目运算符
~按位取反运算符~表达式单目运算符
sizeof长度运算符sizeof(表达式)
3/表达式 / 表达式从左到右双目运算符
*表达式 * 表达式
%余数(取模)整型表达式 % 整型表达式
4+表达式 + 表达式从左到右
-表达式 - 表达式
5<<左移变量 << 表达式从左到右
>>右移变量 >> 表达式
6>大于表达式 > 表达式从左到右
>=大于等于表达式 >= 表达式
<小于表达式 < 表达式
<=小于等于表达式 <= 表达式
7==等于表达式 == 表达式从左到右
!=不等于表达式 != 表达式
8&按位与表达式 & 表达式从左到右
9^按位异或表达式 ^ 表达式从左到右
10|按位或表达式 | 表达式从左到右
11&&逻辑与表达式 && 表达式从左到右
12| |逻辑或表达式 | | 表达式从左到右

13

? :条件运算符表达式1 ? 表达式2 : 表达式3从右到左三目运算符
14=赋值运算符变量 = 表达式从右到左
/=除后赋值变量 /= 表达式
*=乘后赋值变量 *= 表达式
%=取模后赋值变量 %= 表达式
+=加后赋值变量 += 表达式
-=减后赋值变量 -= 表达式
<<=左移后赋值变量 <<= 表达式
>>=右移后赋值变量 >>= 表达式
&=按位与后赋值变量 &= 表达式
^=按位异或后赋值变量 ^= 表达式
|=按位或后赋值变量 |= 表达式
15,逗号运算符表达式 , 表达式 , .....从左到右从左向右顺序运算

说明:同一优先级的运算符,运算次序由结合方向决定

6.1 在讲解具体运算符之前,介绍几个与之相关的术语

        操作数(operand)、运算符(operator)、左值(lvalue)和右值(rvalue)。
        操作数(operand)是程序操纵的数据实体,该数据可以是数值、逻辑值或其他类型。该操作数既可以是常量也可以为变量。
        运算符(operator)是可以对数据进行相应操作的符号。如对数据求和操作,用加法运算符‘+',求积操作使用乘法运算符*’等。
        根据运算符可操作的操作数的个数,可把运算符分为一元运算符(单目运算符)、二元运算符(双目运算符)和 多元运算符 (C语言只有一个三元运算符(?:),三目运算符)。
        C语言提供了丰富的运算符:
                有: 算术运算符、关系运算符、逻辑运算符、赋值运算符、移位运算符、逗号运算符及 sizeof运算符。

        对应有:算术表达式、关系表达式、逻辑表达式、赋值表达式、移位表达式、逗号表达式及sizeof表达式等。

        左值(lvalue)右值(rvalue)按字面意思通俗地说。以赋值符号=为界,=左边的就是左值,=右边就是右值.

        按权限来说,左值可读可写,右值只可读。

6.2 运算符举例

        1.%(余数)取模

        2. *=,+=

        3.三目运算符

        4.主要讲解前置++,和后置++;

1.余数的定义:整除“余”下的“数”。

则有: 余数= 被除数 – 商 * 除数

商就是我们整除的结果。

参考链接地址:
示例1:&取模

 示例2:*=

 示例3:三目运算符  条件表达式1 ?表达式1 :表达式2

 示例4:前置++和后置++ 的区别


七、指针 

        内存(在程序中称为主存DRAM)是计算机中重要的部件之一,它是外存(硬盘)与CPU进行沟通的桥梁。

        计算机中所有程序的运行都是在内存中进行,为了有效的使用内存,就把内存以8位二进制(bit)划分为存储单元(也就是1字节)。为了有效的访问到内存的每个存储单元,就给内存存储单元进行了编号,这些编号被称为该内存存储单元的地址。

图示:

主存示意图:

 储存地址的变量称为指针变量。在C语言中,指针就是地址。


八、结构体

程序开发人员可以使用结构体来封装一些属性,设计出新的类型,在C语言中称为结构体类型。

在c语言中,结构体是一种数据类型。(由程序开发者自己设计的类型)

示例:设计学生类型


九、关键字

        C语言关键字共有32个,根据关键字的作用,可分为数据类型关键字,控制语句关键字。

9.1、数据类型关键字

 void        char        short        int        longfloat        double        signed        unsigned        

truct        union        enum        typedef        sizeof        auto        static        register

extern        const        volatile

9.2、流程控制关键字

if        else        switch        case        default        for        do        while        return continue        break        goto

9.3、C99新增(五个)

        1、inline 关键字用来定义一个类的内联函数,引入它的主要原因是用它替代C中表达式形式的宏定义
        引入原因:C语言是一个效率很高的语言,这种宏定义在形式及使用上像一个函数,但它使用预处理器实现,没有了参数压栈,代码生成等一系列的操作

        2、restrict关键字只用于限定指针;该关键字用于告知编译器,所有修改该指针所指向内容的操作全部都是基于(baseon)该指针的,即不存在其它进行修改操作的途径;这样的后果是帮助编译器进行更好的代码优化,生成更有效率的汇编代码。

        3、_Bool关键字是用于表示布尔值。包含标准头文件 stdbool.h 后,我们可以用bool 代替_Bool,true 代替1 , false 代替0。

        4、_Complex and _lmaginary关键字
        C99标准中定义的复数类型如下: float Complex; float_lmaginary; double_Complex; double_lmaginary; longdouble_Complex; long double_Imaginary.
        <complex.h>头文件中定义了complex和 imaginary宏,并将它们扩展为_Complex和_lmaginary,因此在编写新的应用程序时,应该使用<stdbool.h>头文件中的complex和imaginary宏。

 

9.4、sizeof 计算类型的大小或变量的大小,也就是字节个数。

9.5、typedef  关键字

        typedef是在计算机编程语言中用来为复杂的声明定义简单的别名。它本身是一种存储类的关键字,与auto、extern、mutable、static、register等关键字不能出现在同一个表达式中。
示例1:

 示例2:

9.6、extern  关键字 

        extern 用在全局变量或函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。

9.7. static  关键字

c语言中static关键字修饰变量和函数; 被static关键字修饰的变量或函数只能被定义一次。

1.局部变量

2.全局变量

3.函数
 

示例:局部变量

 示例:全局变量和函数

被static关键字修饰的全局变量或函数,不能在其他文件被extern引用。

 编译链接结果:

9.8、const  关键字

        const在实际编程中用得比较多,const是constant 的缩写,意思是“恒定不变的”!它是定义只读变量的关键字,或者说const是定义常变量的关键字。(可读,不可写)
        const 可以修饰变量,数组,指针等;说 const定义的是变量,但又相当于常量;说它定义的是常量,但又有变量的属性,所以叫常变量。用const定义常变量的方法很简单,就在通常定义变量时前面加const 即可,如:
        const int a = 10;
const和变量类型int可以互换位置,二者是等价的,即上条语句等价于:

        int const a = 10;

        那么用const修饰后和未修饰前有什么区别呢?用const定义的变量的值是不允许改变的,即不允许给它重新赋值即使是赋相同的值也不可以。所以说它定义的是只读变量。这也就意味着必须在定义的时候就给它赋初值。无论是全局常变量还是局部常变量都必须初始化赋值。
 示例:const  修饰变量和数组

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值