C语言概述


一、c语言的编译链接过程:

二、C源程序的结构特点

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

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

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

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

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

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


三、数据类型的大小

(有的编译器不同,所占的字节数也不同,如long double 在DEV中是12个字节)

#include<stdio.h>
//sizeof 关键字 计算变量或数据类型所占的字节个数
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;
}

三、变量,常量,标识符

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

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

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

什么是定义︰所谓的定义就是为这个变量分配一块内存并给它取上一个名字,这个名字就是我们经常所说的变量名。但注意,这个名字一旦和这块内存匹配起来,它们就同生共死,终生不离不弃,并且这块内存的位置也不能被改变。一个变量在一定的区域内(比如函数内,全局等)只能被定义一次,如果定义多次,编译器会提示你重复定义同一个变量或对象。

什么是声明:(有两重含义,如下:)
第一重含义:告诉编译器,这个名字已经匹配到一块内存上了。
第二重含义:告诉编译器,我这个名字我先预定了,别的地方再也不能用它来作为变量名。

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


3.1  变量                                                          

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

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

块变量:在函数块内定义的变量

#include<stdio.h>
int g_sum = 100; //全局变量
int main()
{
	float ft = 12.23f;  //局部变量
	int a = 10;
	int g_sum = 0;  //局部变量和全局变量同名

	a = g_sum;
	printf("%d", a);
	return 0;


}

全局变量和局部变量冲突时,向上就近原则

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

}

int g_max = 10;
int main()
{
	
	int a = 10;
	int b = g_max;
	int g_max = 0;
	printf("b = %d \n", b);
	return 0;

}

3.2 常量

c语言的常量分为

1.字面常量

2.用#define定义的宏常量 (无类型,不开辟空间,只在预编译的时候起作用,预编译处理宏常量)

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

4.枚举常量(实际上受到限制的整型量 1.取值范围受到约束2.运算的约束     枚举值必须是整型,若没有枚举值,默认第一个为0,后面依次加一)

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

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

#include<stdio.h>
#define PI 3.14 //宏常量
enum week { Mon = 1, Tues = 2, Wed = 3, Thurs = 4, Fri = 5, Sun = 7};//枚举常量

int main()
{
	const float r = 10.25f; //用const 修饰的常变量
	r = 0;
	float s = 0.0f;
	const int a = 100;
	enum week w = Mon;  // 枚举常量
	s = r * r * PI;

	return 0;


};

枚举常量

#include<stdio.h>
enum  week //枚举常量,所给的值必须是整型
{
	Mon = 1,
	Tues = 2,
	Wed = 3,
	Thurs = 4,
	Fir = 5,
	Sat = 6,
	Sun = 7
};//枚举量实际上是一种受到限制的整型量
int main()
{
	//a 是整型,可以是任何整数,可以自加自减
	int a = -10;
	a += 10;
	a = 10;
	//x 不能随便给值,只能给有的值,也不能给1-7,只能给Mon,Tues ...,枚举不能自加自减
	enum week x = Mon;

	a = x;//这是可以的,
	x = a;//这个就不行,因为a的值有可能不在x的范围里


}

四、转义字符及其含义

转义字符以反斜线"\"开头,后跟一个或几个字符。转义字符具有特定的含义,不同于字符原有的意义,故称“转义”字符。
使用转义字符时需要注意下问题:

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

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

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

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

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

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

五、运算符

5.1  c语言运算符优先级表

操作数(operand)、运算符(operator)、左值(lvalue)和右值(rvalue).

操作数(operand)是程序操纵的数据实体,该数据可以是数值、逻辑值或其他类型。该操作数既可以是常量也可以为变量。

运算符(operator)是可以对数据进行相应操作的符号。如对数据求和操作,用加法运算符‘+',求积操作使用乘法运算符‘*’等。

根据运算符可操作的操作数的个数,可把运算符分为一元运算符(单目运算符)、二元运算符(双目运算符)和多元运算符(C语言只有一个三元运算符(? :),三目运算符)。所有的单目运算符中只有自加自减具有回写功能,其他都不具有。
 

C语言提供了丰富的运算符:

有∶算术运算符、关系运算符、逻辑运算符、赋值运算符、移位运算符、逗号运算符及sizeof运算符。

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

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

左值即可取值又可赋值,右值只可取值,不可赋值。

六、顺序语句,选择语句,循环语句

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

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

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

6.1选择语句

int main()
{
	int age;
	age = scanf_s("请输入你的年龄:%d", &age);
	if(age >=18)
	{
		printf("恭喜你,成年了");
	}
	else
	{
		printf("你还未成年");
	}
	return 0;
}

6.2 循环语句

int main()
{
	int i, sum;
	i = 1; sum = 0;
	while (i <=100)
	{
		sum = i + sum;
		++i;

	}
	printf("sum = %d\n", sum);
}

if(a>b)
{
    max = a;
}
else
{
    max = b;
}

双分支语句改为单分支语句

max = a;
if(b>max)
{
    max = b;
}

七、函数

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

             

凡是在函数里面定义的变量都存储在栈区;凡是在函数外面定义的变量都存储在数据区。

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

作用域(可见性)指标识符能够被使用的范围;只有在作用域内标识符才可以被使用。此阶段针对编译和链接过程。

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

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

文件中定义的全局变量和函数都具有文件作用域。

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

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

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

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

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

八、指针

一个存储单元 = 一个字节 = 8bit(比特)

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

指针有两个值,一个是自身的地址,另一个是存储的地址。

X64   8字节

X86   4字节

int *p =&a;//和类型在一起的 * 是声明,声明p是指针

*p //这里的 * 代表解引用

*p ->*&a ->a

通过指针修改变量的值

#include<stdio.h>
#include<ctype.h>

void Swap_p(int* ap, int* bp)
{
	int tmp = *ap;
	*ap = *bp;
	*bp = tmp;
}
int main()
{
	int x = 10, y = 20;
	Swap_p(&x, &y);
	printf("%d %d\n", x, y);//20 10
	return 0;
}

九、结构体

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

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

示例:设计学生类型

#include<stdio.h>
struct Student
{
	char s_id[10];//学号
	char s_name[10];//姓名
	char s_sex[5];//性别
	int s_age;//年龄
};
int main()
{
	//定义结构体变量,并初始化,初始化必须用花括号,顺序与定义的保持一致
	struct Student stud = { "202001","jfdi","man",15 };
	//使用.访问结构体变量的成员
	printf("id : %s\n", stud.s_id);
	printf("name : %s\n", stud.s_name);
	printf("sex : %s\n", stud.s_sex);
	printf("age: %d\n", stud.s_age);
	return 0;
}

int x ;//x 是  int 型的  ,4 个字节

Student a;//a 是 student 型的   ,32 个字节

int *p = &x;

Student *ap = &a;

struct定义想要的类型,和内置类型一样,可以做相同的事。

只能访问结构体变量(eg:a),不能访问结构体本身。结构体本身是一种概念,是图纸。结构体变量是实体

十、关键字

C语言的关键字共有32个,根据关键字的作用,可分为数据类型关键字,控制语句关键字。
1数据类型关键字
void      char   short    int    long   float    double     signed     unsigned     truct   union   enum    typedef   sizeof   auto   static  register   extern   const    volatile
2.流程控制关键字
if     else   switch    case   default   for   do    while     return   continue     break    goto

3.C99新增(5 个)
1、inline关键字用来定义一个类的内联函数,引入它的主要原因是用它替代C中表达式形式的宏定义
引入原因: C语言是一个效率很高的语言,这种宏定义在形式及使用上像一个函数,但它使用预处理器实现,没有了参数压栈,代码生成等一系列的操作
2、restrict 关键字只用于限定指针;该关键字用于告知编译器,所有修改该指针所指向内容的操作全部都是基于(base on)该指针的,即不存在其它进行修改操作的途径;这样的后果是帮助编译器进行更好的代码优化,生成更有效率的汇编代码。
3、_ Bool关键字是用于表示布尔值。包含标准头文件stdbool.h后,我们可以用bool 代替_ Bool,true代替 1,false代替0。
4、.Complex and_ lmaginary 关键字
C99标准中定义的复数类型如下: float _Complex; float Imaginary; double_ Complex; double_ Imaginary; long  double. _Complex; long double. _lmaginary.
<complex.h>头文件中定义了complex和imaginary宏,并将它们扩展为_ Complex 和Imaginary,因此在编写新的应用程序时,应该使用<stdbool.h>头文件中的complex和imaginary宏。
4. sizeof计算类型的大小或变量的大小,也就字节个数。
5.typedef关键字
typedef是在计算机编程语言中用来为复杂的声明定义简单的别名。它本身是一种存储类的关键字,与.auto、extern. mutable、 static、 register 等关键字不能出现在同一个表达式中。
6.extem关键字
extem用在全局变量或函数的声明前,用来说明"此变量/函数是在别处定义的,要在此处引用" .

在同一工程下,使用其他文件下的函数时,加上外部关键字extem。

eg:extern  int g_max;extern void fun()

告诉编译器,g_max,fun()在其他文件下.
7.static关键字
C语言中static关键字修饰变量和函数,C++ 有其他用法后面讲解;
   1.局部变量   2.全局变量    3. 函数
8. const关键字(只在.cpp文件下起作用)
const在实际编程中用得比较多, const 是constant的缩写,意思是“恒定不变的”!它是定义只读变量的关键字,或者说const是定义常变量的关键字。(可读, 不可写)
const可以修饰变量,数组,指针等;说const 定义的是变量,但又相当于常量;说它定义的是常量,但又有变量的属性,所以叫常变量。用const定义常变量的方法很简单,就在通常定义变量时前面加const 即可,如:
const int a= 10
const和变量类型int 可以互换位置,二者是等价的,即上条语句等价于:
int const a= 10,

那么用const 修饰后和未修饰前有什么区别呢?用const 定义的变量的值是不允许改变的,即不允许给它重新赋值,即使是赋相同的值也不可以。所以说它定义的是只读变量。这也就意味着必须在定义的时候就给它赋初值。

无论是全局常变量还是局部常变量都必须初始化赋值。

#include<stdio.h>
int main()
{
	const int a = 10;//.cpp 文件下,遇见const 在编译时将a全部替换为10
	int b = 0;
	int* p = (int*)&a;
	*p = 100;
	b = a;//a替换为10,相当于 b = 10;
	printf("%d %d %d\n", a, b, *p);
}

 要是在.c 文件下,结果为(.c文件下不发生替换)

目录

一、c语言的编译链接过程:

二、C源程序的结构特点

三、数据类型的大小

三、变量,常量,标识符

四、转义字符及其含义

五、运算符

六、顺序语句,选择语句,循环语句

七、函数

八、指针

九、结构体

十、关键字


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值