初识C语言——大概讲述一下C的世界

发布于:2023-02-01 ⋅ 阅读:(657) ⋅ 点赞:(0)

1.什么是C语言

C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易
的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程语言有所不同。
其编译器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等。

2. 第一个C语言程序 - 写个代码,在屏幕上打印:好好学习

写代码 - (C语言的代码是从主函数的第一行开始执行的)

1.写出主函数(main函数)- 所有C语言代码中得有main函数-入口

2.使用printf,也得打招呼,引用头文件 [引用头文件 stdio.h]

(printf -库函数 -在屏幕上打印信息)

注意:一个工程中有且仅有一个main函数
1、一个工程中可以有多个.c文件
2、但是多个.c文件中只能有一个main函数

3.数据类型

计算机语言主要通过写程序来解决生活中的问题,所以就必须要有能力来描述生活中问题!比如:商场商品的价格15.6元 - 小数、人的年龄50岁 - 整数等等,而15.6和50在C语言中的数据类型分别是浮点型和整型。

数据类型有以下几种

char            //字符数据类型                char ch = 'a'

short           //短整型                           short num = 10

int               //整形                               int age = 50

long            //长整型                           long b = 6666

long long   //更长的整形                    long long a = 66666

float           //单精度浮点数                 float weight = 55.5

double       //双精度浮点数                 double d = 0.0

每种类型的大小是多少?

这里我们就要用到一个操作符:sizeof( ),用来计算类型或者变量所占空间的大小,并且通过%d来打印出一个整数

4. 变量、常量

生活中的有些值是不变的(比如:圆周率,性别,身份证号码,血型等等),有些值是可变的(比如:年龄,体重,薪资)。

不能改变的量,C语言中用常量的概念来表示,能被改变的量C语言中用变量来表示。

4.1 定义变量的方法

如何创建一个变量

类型 变量的名字 = 0;(推荐)

例如:

int age = 22;
double weight = 63.1;

类型 变量的名字;(不推荐)

例如:

int age;
double weight;

4.2 变量的分类

  • 全局变量:简单来说,就是在main函数{}外部定义的变量
  • 局部变量:在main函数{}里面定义的变量
int a = 100;//全局变量

int main()
{

	int a = 10;//局部变量

	printf("%d\n", a);

	return 0;
}

注意:

1、当局部变量和全局变量的名字冲突的情况下,局部变量优先

2、不建议把全局变量和局部变量的名字写成一样的

4.3 变量的使用

int main()
{
	int a = 0;
	int b = 0;
	int sum = 0;
	scanf("%d %d",&a,&b);//scanf函数是输入函数,在这里可以设置输入两个变量的值
	sum = a + b;
	printf("sum = %d", sum);

	return 0;
}

4.4 变量的作用域和生命周期

作用域:作用域(scope)是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用的而限定这个名字的可用性的代码范围就是这个名字的作用域。

  • 局部变量的作用域:就是变量所在的局部范围
  • 全局变量的作用域:整个工程

1、局部变量的作用域

由于a是局部变量,所以当a超出它的作用域之后,它就不能被使用了

int main()
{
	printf("hehe\n");
	{

		int a = 10;	
		printf("a = %d\n", a);
	}
	int a = 66;
	printf("a = %d\n", a);

	return 0;
}

 并且a在它的每一个作用域中都有它所对应的值,不同的作用域不会互相打扰的哦

2、全局变量的作用域

int g_val = 2021;
int main()
{
	printf("全局变量第一次调用:%d\n", g_val);
	{
		printf("全局变量第二次调用:%d\n", g_val);
	}
	printf("全局变量第三次调用:%d\n", g_val);

	return 0;
}

全局变量在每个位置都可以调用,包括不是同一个.c文件,也可以调用

//声明一下变量
extern int g_val;
int main()
{
	printf("%d\n", g_val);

	return 0;
}

 

通过声明变量,可以在test2.c中调用在另外一个文件add.c中的全局变量g_val,但是全局变量整个工程中的命名是不能重复的,整个工程只有一个命名为g_val的全局变量哦。

生命周期:变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段

  • 局部变量的生命周期:进入局部范围生命开始,出局部范围生命结束
  • 全局变量的生命周期:程序的生命周期

变量的生命周期只在它存在的{ }中,出了{ }就结束了它的生命周期

int main()
{
	{
		int a = 10;
		printf("%d\n", a);
	}

	return 0;
}

但是全局变量的生命周期很坚强,它可以一直在一个工程里面存活,直到另外一个工程的产生

4.5 常量

C语言中的常量分为以下以下几种

  • 字面常量
  • const 修饰的常变量
  • #define 定义的标识符常量
  • 枚举常量

1、字面常量:

int main()
{
    3.14;
    10;
    'a';
    "abcdef";
    //上面这些都是字面常量
    
    return 0;
}

2、const 修饰的常变量:

int main()
{
    const int num = 10;//num就是常变量
    num = 20;
    printf("num = %d\n", num);
    
    return 0;
}

其实const 修饰的常变量本身还是变量,只是具有了常属性(不能被改变的属性)而已,所以才叫常变量,我们来看看下面这个例子,就能知道它本身还是变量啦

我们的数组定义[ ]里面需要一个常量才可以正常定义进去,如果我们const修饰的是常量的话,那么我们肯定也可以把这个参数定义到数组里面哦

但是在这里我们看到报错了,说明const 修饰的常变量本身还是变量,并不会真正变为常量哦

3、#define 定义的标识符常量

#define MAX 10000

int main()
{
    int n = MAX;
    printf("%d\n", n);
    
    return 0;
}

经过define定义后的常量是可以正常使用的哦,正是因为是常量,所以我们在下面就不能对它进行修改,大家要谨记。

#define MAX 10000

int main()
{
    MAX = 20000;//这种定义是错误的,因为MAX已经是常量了,所以我们不能去修改他
    
    int n = MAX;

    return 0;
}

4、枚举常量(可以一一列举的常量,并且是递增的常量)

enum Sex
//我们在这里定义一个函数,并且给MALE赋值
{
	MALE = 3,//赋初值
	FEMALE,
	SECRET
};

int main()
{
	enum Sex s = MALE;//我们在这里将定义的函数赋给s,并且将MALE的值也赋给s
	printf("%d\n", s);
	printf("%d\n", MALE);
	printf("%d\n", FEMALE);
	printf("%d\n", SECRET);

	return 0;
}

我们来看一下运行结果

我们可以很清楚的看到,FEMALE、SECRET两个值在MALE的递增下变成了4和5,这也就是我们的枚举常量。

枚举常量赋值的数字是从0开始的,我们可以来看看下面的代码和运行结果

enum Sex
//我们不给MALE赋初值看看运行结果
{
	MALE,
	FEMALE,
	SECRET
};

int main()
{
	enum Sex s = MALE;
	printf("%d\n", s);
	printf("%d\n", MALE);
	printf("%d\n", FEMALE);
	printf("%d\n", SECRET);

	return 0;
}

结果MALE是从0开始的,所以我们就可以确定,枚举常量赋值的数字确实是从0开始的

5. 字符串+转义字符+注释

5.1 字符串:

字符串就是一串字符,用双引号括起来的一串字符

int main()
{
	"abcdef";//字符串
	
    "hello bit";//字符串

	return 0;
}
注:字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串内容,不然我们来看看。
int main()
{
    char arr1[] = "abc";//我们通过数组来查看字符串

    char arr2[] = { 'a', 'b', 'c' };

    return 0;
}

通过监视我们可以很容易的发现,arr1这个数组的字符串在结尾的位置隐藏了一个\0的字符,所以\0是字符串的结束标志,但是arr2的这个数组却没有\0这个结束标志,我们来看看会有什么影响吧

int main()
{
    char arr1[] = "abc";

    char arr2[] = { 'a', 'b', 'c' };
	
    //求一下字符串的长度
	printf("%d\n", strlen(arr1));
	printf("%d\n", strlen(arr2));
	
    //打印字符串
	printf("%s\n", arr1);
	printf("%s\n", arr2);

    return 0;
}    

 

通过查看字符串的长度,我们发现arr1的长度确实是3,这是因为arr1有\0作为结束标志。但是arr2的长度为15,这是为什么呢?其实是因为arr2没有\0这个结束标志,所以编译器会继续往后寻找,直至找打\0,才会停止,所以这里显示出来的是15,说明它在寻找了15个元素后才找到\0(每个编译器的结果都是不一样的,寻找的结果都是随机的哦)。所以打印字符串也是这个道理,由于arr1有\0作为结束标志,所以可以正确打印出abc,但是arr2却没有结束标志,所以在打印完abc后还会打印一些我们想象不到的东西。由此可得,字符串的结尾其实隐藏了一个\0的字符。

5.2 转义字符

假如我们要在屏幕上打印一个目录: c:\test\test.c

int main()
{
	printf("c:\test\test.c");

	return 0;
}

 

这是为什么呢?

这里就不得不提一下转义字符了。转义字符顾名思义就是转变意思。
我们来看一下下面这些转义字符
转义字符
释义
\?
在书写连续多个问号时使用,防止他们被解析成三字母词
\'
用于表示字符常量'
\“
用于表示一个字符串内部的双引号
\\
用于表示一个反斜杠,防止它被解释为一个转义序列符。
\a
警告字符,蜂鸣
\b
退格符
\f
进纸符
\n
换行
\r
回车
\t
水平制表符
\v
垂直制表符
\ddd
ddd表示1~3个八进制的数字。 如: \130 X
\xdd
dd表示2个十六进制数字。 如: \x30 0

我们发现,原来是因为\t被编译器识别我们水平制表符(即我们的tab键),所以就导致显示出来的情况是那样子,所以我们来进行改正,将其可以正常展示出来。

int main()
{
	printf("c:\\test\\test.c");

	return 0;
}

我们利用一个反斜杠,防止它被解释为一个转义序列符,就可以正常展现啦!

5.3 注释

  • 1. 代码中有不需要的代码可以直接删除,也可以注释掉
  • 2. 代码中有些代码比较难懂,可以加一下注释文字

比如

 我们大部分使用的是//来进行注释的哦!

6. 选择语句

如果你好好学习,就能找到一个好工作,走上人生巅峰,迎娶白富美。

如果你不好好学习,就只能进厂搬砖了。

这就是选择!

int main()
{
	int input = 0;//输入的值
	printf("你要好好学习吗(1/0)?>:");
	scanf("%d", &input);
	
	if (input == 1)
		printf("找到一个好工作\n");
	else
		printf("进厂搬砖\n");

	return 0;
}

7. 循环语句

C语言中如何实现循环呢?

  • while语句
  • for语句
  • do ... while语句
int main()
{
	int line = 0;
	while (line < 30000)
	{
		printf("写代码:%d\n",line);
		line++;
	}
	if (line == 30000)
	{
		printf("好offer\n");
	}

	return 0;
}

8.函数

int main()
{
    int num1 = 0;
    int num2 = 0;
    int sum = 0;
    printf("输入两个操作数:>");
    scanf("%d %d", &num1, &num2);
    sum = num1 + num2;
    printf("sum = %d\n", sum);
    return 0; 
}

但当我们加入函数的时候,就会变成这样子

int Add(int x, int y) 
{
    int z = x+y;
    return z; 
}

int main()
{
    int num1 = 0;
    int num2 = 0;
    int sum = 0;
    printf("输入两个操作数:>");
    scanf("%d %d", &num1, &num2);
    //函数的方式解决
    sum = Add(num1, num2);
    printf("sum = %d\n", sum);
    return 0; 
}

我们利用Add函数调用两个数进行相加,有人就会问,这样子还要写多一个函数,不是更复杂吗?其实当函数被写出来后,我们可以重复调用它,我们就可以直接传入参数进行相加,也省去了重复在里面写相加的代码,何乐而不为呢,函数的特点就是简化代码,代码复用。

9.操作符

算术操作符

+          -         *         /         %

移位操作符

>>        <<

位操作符

&        ^        |

赋值操作符

=      +=      -=      *=      /=      &=      ^=       |=         >>=        <<=

单目操作符

!

逻辑反操作

-

负值

+

正值

&

取地址

sizeof

操作数的类型长度(以字节为单位)

~

对一个数的二进制按位取反

--

前置、后置--

++

前置、后置++

*

间接访问操作符(解引用操作符)

(类型)

强制类型转换

关系操作符

>

>=

<

<=

!=

用于测试不相等

==        

用于测试相等

逻辑操作符

&&

逻辑与

||

逻辑或

条件操作符

exp1 ? exp2 : exp3

逗号表达式

exp1, exp2, exp3, …expN

下标引用、函数调用和结构成员

[]         ()         .         ->

10.常见关键字

auto  break   case  char  const   continue  default  do   double else  enum  

extern float  for   goto  if   int   long  register    return   short  signed

sizeof   static struct  switch  typedef union  unsigned   void  volatile  while

暂时就先分享这么多,如果有哪些说错的话欢迎各位提点,因为我也是第一次学习,有些可能也不是很懂,很期待能跟大家交流,谢谢大家的浏览。

最后在这这里附上我的Gitee地址,大家有兴趣的也可以看看我平时练习的代码(我只是一个菜鸟的初学者,求大家轻点喷QAQ)

努力的敲键盘 (shibyliuxin) - Gitee.com

本文含有隐藏内容,请 开通VIP 后查看