1.C语言常见概念

C语言是什么

和计算机打交道首先要知道计算机能直接明白的语言是什么,是机器语言,也有的说是低级语言。例如:要计算机完成两数相加这样简单的事情,要分成类似以下几个步骤:

从内存位置2000上把一个数字拷贝到寄存器1。
从内存位置2004上把另一个数字拷贝到寄存器2。
把寄存器2中的内容与寄存器1中的内容相加,把结果存储在寄存器1中。
把寄存器1中的内容拷贝到寄存器2。

而人要做的是,必须用数字码来表示以上的每个步骤。

“用机器语言编程的黄金时代已一去不复返,但是,如果你对有趣的事情比较感兴趣,不妨试试高级编程语言。”------《C primer plus》

C语言就是“高级编程语言”(此外,还有“高级语言”“高级计算机语言”的说法)的一种,高级语言还包括C++,Java,python等等,而高级语言和上面提到的低级语言则统称为“程序语言”。
那么高级语言里面还有没有分类呢,我们首先要知道,既然计算机能直接明白的语言是低级语言,那么我们写出来的高级语言必须翻译成低级语言才能让计算机读懂,所以根据各种高级语言的翻译方式的不同,高级语言被分成了两类:编译型语言和解释型语言。在这里插入图片描述
编译型语言是怎么被翻译成低级语言的呢,首先编译器将“源代码”转换成“目标代码”,链接器再将“目标代码”转换成“可执行代码”,那么最终的可执行代码(二进制)就是低级语言代码了。常见的编译型语言有C/C++。
解释型语言是怎么被翻译成低级语言的呢,解释器解释每一句源代码,构成可执行代码。常见的解释型语言有python。
编译型语言和解释型语言最主要的区别在于:编译型语言是代码在执行前先行被全部编译完成,而解释型语言则是代码在执行期动态解释。

集成开发环境

既然C语言是一种编译型语言,编译器必不可少,我们写下代码后如何通过编译,链接最后使我们写的代码能够运行呢,常见编译器有msvc,clang等。更为方便的是,有一些集成开发环境供我们使用。

集成开发环境(IDE)用于提供程序开发环境的应用程序,一般包括代码编辑器,编译器,调试器和图形用户界面等工具。集成了代码编写功能,分析功能,编译功能,调试功能等一体化的开发软件服务套。

常见集成开发环境有:VS,XCode,DevC++等等。(我本人用的VS2022)
在集成开发环境里,我们既可以写代码又可以编译调试运行。

第一个C语言程序

#include<stdio.h>
int main()
{
printf("hello world!");
return 0;
}

该程序运行的结果是屏幕上出现了:hello world!
可能这是大部分学计算机的人遇到的第一个代码,接下来对每条语句涉及的内容进行大致的解释,具体内容以后会更详细地解释。
**#include<stdio.h>**相当于把stdio.h文件中的所有内容都输入到改行所在的位置,stdio.h是标准输入/输出头文件。只要需要从屏幕上输入或者输入则必须要包含这个头文件。其中.h是头文件的后缀,stdio中st是standard,i是input,o是output。

头文件是在C程序顶部的信息集合,头文件包含了编译器创建最终可执行程序要用到的信息。例如,头文件中可以定义一些常量,或者指明函数名以及如何使用它们,但是,函数的实际代码在一个预编译代码的库文件中。简而言之,头文件帮助编译器把你的程序正确地组合在一起。每次用到库函数都会用#include指令包含ANSI/ISO标准指定的头文件。------《C primer plus》

**int main();**是在声明main()函数:int是函数返回类型:整型(属于数据类型的内容,将在下一篇博客中解释),与下面花括号中的return 0是对应的;main是函数名;()内是函数参数,如果不想使用参数,可以不写,写了也可以不用;花括号内部是函数体。(对于函数,以后会做更深入的解释)

main()函数

C语言的基本组成单位是函数。main()函数也叫做主函数,足以看出其重要性,那么它重要在哪呢?
每个C语言程序不管有多少行代码,都是从main()函数开始执行的,main()函数是程序的入口,即使一个项目中有多个.c文件,但是只能有一个main()函数,因为程序的入口只能有一个。

printf()和库函数

**printf(“hello world!”);**使用了printf()函数,实现了在屏幕上信息的打印。printf()是一个库函数,它的功能是在标准输出设备(一般指屏幕)上进行信息的打印。()中的内容是从main()函数传递给printf()函数的信息。
上面提到printf()是一个“库函数”,那么什么是库函数呢?

为了不再重复实现常见的代码,让程序员提升开发效率,C语言标准规定了一组函数,包括规定这些函数的功能,参数以及返回值,这些函数再有不同的编译器厂商根据标准进行实现,提供给程序员使用。不同编译器厂商(例如微软-msvc;苹果-clang等等)实现的这些函数可能有些许不同,但其功能,参数以及返回值是一致的。这些函数组成了一个函数库,被称为标准库,这些函数也被称为库函数

一个系列的库函数一般会声明在同一个头文件中(例如上面提到的stdio.h),所以库函数的使用,要包含对应的头文件。

return 0; 表示函数执行结束的时候返回的东西,返回什么呢?和声明时的函数返回类型一致,例如这里的return 0属于main()函数,前面声明时我们用了int main(),那么return后必须跟一个整型,0可以1也可以2也可以,但是一般情况下,return 0代表程序正常退出。那么返回到哪里呢?返回给操作系统。
不了解什么是操作系统的小伙伴可以看一下这个【5分钟了解操作系统】https://www.bilibili.com/video/BV1Fs411F74f?vd_source=df901edad798580c2bf7b152605648fb

关键字

我们已经对上面的c语言代码有了初步的认识,那么诸如int return这种固定的符号是什么呢?

关键字是C语言的词汇,它们对C而言比较特殊,是保留给C语言使用的符号,也叫做“保留字”,不能用它们作为标识符(如,变量名),否则,编译器会将其视为语法错误。关键字也是不能自己创建的。C语言的32个关键字如下:
auto break case char const continue default do double else enum ex
float for goto if int long register return short signed sizeof struct switch
typedef union unsigned void volatile while
注:在C99标准中加入了inline restrict _Bool _ Complex _Imaginary等关键字。

字符和ASCII编码

到现在为止我们已经看到了各种字符,在键盘上可以敲出各种字符,例如:A,b,#,@等等,这些符号都被称为字符,而在C语言中,字符是用单引号括起来的,例如:‘a’,这样才合法,才表示字符a
当我们在写代码中敲下这些字符,源代码被编译链接成可执行代码后,这些字符会是以怎样的形式存在呢?我们已经知道可执行代码是计算机能够读懂的代码,那么计算机能读懂我们敲下的这些字符吗?当然不可以。
计算机只能读懂二进制,在计算机中所有的数据都是以二进制的形式储存的,那么字符是转换成了什么样的二进制来储存的呢?

如果我们每个人自己给这些字符中的每个字符编一个二进制序列,这个叫做编码,为了方便大家相互通信,不造成混乱,美国国家标准学会(ANSI)出台了一个标准ASCII编码,C语言中的字符就遵循了ASCII编码的方式。

ASCII码表

在这里插入图片描述
我们并不需要完全背下来,但我们需要掌握几组特殊的数字:
ASCII码值0~31这32个字符是不可打印字符,无法打印在屏幕上观察
字符A~Z的ASCII码值 65~90
字符a~z的ASCII码值 97~122
对应的大小写字符(如A和a,B和b)的ASCII码值差值为32(小写字符码值=大写字符码值+32)
数字字符0~9的ASCII码值 48~57
换行符’\n’的ASCII码值是10

转换说明

我们如何将字符打印到屏幕上呢?
可以这样

#include<stdio.h>
int main()
{
printf("a");
retuen 0;
}

上述代码是将a作为字符串打印到屏幕上
那么如果我们想打印的是某个字符变量呢?

#include<stdio.h>
int main()
{
char nn;//变量名nn随便取的
nn='a';
printf("%c",nn);
return 0;
}

我们看到printf()函数里又出现了新的东西:%c。
%c叫做占位符(形象地理解为占一个位置,输出或输入时会被逗号后面的变量替换),用来指定格式,%提醒程序要在该处打印一个变量,c表明把变量作为字符打印。此外还有%d,%s等等。
%用来标识转换说明,如果单独使用一个%符号,编译器会认为漏掉了一个转换字符,因此打印%字符就成了个问题,解决方法就是使用两个%符号。另外,在%和转换字符之间插入修饰符可修饰基本的转换说明(这里先不详细展开解释了)。

转换说明把以二进制格式存储在计算机中的值转换成一系列字符(字符串)以便于显示。例如,数字76在计算机内部的存储格式是二进制数01001100。%d转换说明将其转换成字符7和6,并显示为76;%x转换说明把相同的值(01001100)转换成十六进制记数法4c;%c转换说明把01001100转换成字符L。
转换可能会误导读者以为原始值被替换成转换后的值。实际上,转换说明是翻译说明,%d的意思是“把给定的数值翻译成十进制整数文本并打印出来。------《C primer plus》

字符串和\0

我们已经了解了字符,字符在计算机内部的存储形式,如何打印字符以及字符的转换说明。接下来我们来了解一下字符串。
字符串是使用双引号括起来的一串字符(而字符是用单引号括起来),例如:“abc”。字符串的转换说明是%s,也可以说是“字符串的打印格式可以用%s来指定”。
C语言字符串中一个特殊的知识,就是在字符串的末尾隐藏放着一个\0字符,这个\0是字符串的结束标志。我们可以利用下面的代码来验证一下\0的功能。

#include<stdio.h>
int main()
{
	char arr1[] = { 'a','b','c' };
	char arr2[] = "abc";
	printf("%s\n",arr1);
	printf("%s\n",arr2);

	return 0;
}

该代码的运行结果为
为什么会打印得不同呢?我们来看一下这两个数组中分别储存的什么。
在这里插入图片描述
在这里插入图片描述

可见arr2数组中比arr1多了个元素:\0。在对arr2数组初始化的时候,我们把一个字符串常量“abc”放在了这个字符数组中,字符串的末尾是自动放着一个\0的,而在arr1数组中,我们只赋了3个元素的值,arr2数组中比arr1多了个元素\0。那如果我们给arr1再多赋一个元素\0呢?

#include<stdio.h>
int main()
{
	char arr1[] = { 'a','b','c','\0'};
	char arr2[] = "abc";
	printf("%s\n", arr1);
	printf("%s\n", arr2);

	return 0;
}

这次代码的运行结果就变成了:在这里插入图片描述
可见\0是打印字符串结束的标志,同样我们在使用strlen()函数计算字符串长度时(string lenth),遇到\0就自动停止了,所以其计算的是\0前面的字符个数。(在使用strlen()库函数时要包含对应的头文件string.h)。
那么为什么最开始的arr1数组的打印会出现abc之后的奇怪的文字呢?在内存中,arr1数组所在位置后面还有其他数据,当打印完abc后没有遇到\0来结束,所以继续往后打印,直至遇到\0,所以会打印出多余的乱码。

转义字符

在前面我们看到了\n,\0,这是什么呢?在字符中有一组特殊的字符叫做转义字符(转变原来的意思的字符)。例如:\n是一个转义字符表示换行的意思,我们可以简单理解为\让n的意思发生的转变,n本来是一个普通的字符,结果被\转义为换行的意思。
在这里插入图片描述
\ddd:ddd表示1~3位八进制的数字。如:\130表示字符X(把130这个八进制数字转换成10进制后的值88作为ASCII码值的字符,当然也可以直接理解为八进制130所对应的ASCII码表中的字符)。另外\0是其中的一种。
\xdd:dd表示两位十六进制的数字。如:\x30表示字符0(字符0并不等同于数字0,字符0的ASCII码值为十进制的48)。

语句和语句分类

到现在为止我们已经见到了许多行代码,我们会发现C语言的代码是由一条条的语句构成的,C语言中的语句可以分为以下五类

  • 空语句
  • 表达式语句
  • 函数调用语句
  • 复合语句
  • 控制语句

对于控制语句,其用于控制程序的执行流程,以实现程序的各种结构方式。
C语言是一种结构化的程序设计语言,支持三种结构:顺序结构,选择结构,循环结构。C语言有九种控制语句,可分为以下三类:

  • 条件判断语句(也叫做分支语句):if语句,switch语句;
  • 循环执行语句:do while语句,while语句,for语句;
  • 转向语句:break语句,goto语句,continue语句,return语句。

注释

在写代码时,我们常常会写注释来让看代码的人能看懂我们的意思,好的注释能让人更好地理解代码。
注释有两种形式,由/* */组成或者//由组成:

/*第一种注释形式
注释
可以写多行*/

//这是第二种注释形式,只能写一行注释

特别要注意的是:
1./开始注释后,遇到第一个/就认为注释结束了,不可以进行“嵌套”,例如:

/*
printf("a");
printf("b");/*第二个注释*/
printf("c");
*/

**2.**双引号里面的注释符号,会成为字符串的一部分,都会被视为普通字符,没有注释作用。例如:

printf("//hello /*world*/");

这篇博客的内容就到这了,第一次写肯定会有很多问题,欢迎大佬们指正~
以后会持续输出学习内容的,通过写博客来检验我知识的输入。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值