揭开C语言神秘的面纱,简单的C语言程序
内容导读
[ 1.2.2前世今生](# 1.2.2前世今生)
[ 1.2.3C语言特点](# 1.2.3C语言特点)
[ 1.3第一个C程序](# 1.3第一个C程序)
[ 4.2常量](# 4.2常量)
[ 4.3变量](# 4.3变量)
[ 4.3.2变量的分类,作用域和生命周期](# 4.3.2变量的分类,作用域和生命周期)
[ 5.2转义字符](# 5.2转义字符)
作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!
博主的码云gitee,平常博主写的程序代码都在里面。
1.什么是c语言
1.1计算机语言
- 机器语言:计算机能直接识别和接受的二进制代码称为机器指令。机器指令的集合就是该计算机的机器语言。 特点:难学,难记,难检查,难修改,难以推广使用。依赖具体机器难以移植。
- 汇编语言:机器语言的符号化。用英文字母和数字表示指令的符号语言。 特点:相比机器语言简单好记,但仍然难以普及。汇编指令需通过汇编程序转换为机器指令才能被计算机执行。依赖具体机器难以移植。
- 高级语言:高级语言更接近于人们习惯使用的自然语言和数学语言。 特点:功能强大,不依赖于具体机器。用高级语言编写的源程序需要通过编译程序转换为机器指令的目标程序。
1.2C语言自我介绍
1.2.1概述
C语言是一门面向过程的计算机编程高级语言,与C++、Java等面向对象编程语言有所不同。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、仅产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。C语言描述问题比汇编语言迅速,工作量小、可读性好,易于调试、修改和移植,而代码质量与汇编语言相当。C语言一般只比汇编语言代码生成的目标程序效率低10%~20%。因此,C语言可以编写系统软件。
二十世纪八十年代,美国国家标准局为了避免各开发厂商用的C语言语法产生差异,给C语言制定了一套完整的美国国家标准语法,称为ANSI C。作为C语言最初的标准。 2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)发布的C11标准是C语言的第三个官方标准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉字编程。
C语言编译器普遍存在于各种不同的操作系统中,例如Microsoft Windows, Mac OS X, Linux, Unix等。C语言的设计影响了众多后来的编程语言,例如C++、Objective-C、Java、C#等。
摘自《360百科》
1.2.2前世今生
1972—1973年间,美国贝尔实验室的D.M.Ritchie 在B语言的基础上设计出了C语言。
最初的C语言只是为描述和实现UNIX操作系统提供一种工作语言而设计的。
随着UNIX的日益广泛使用,C语言也迅速得到推广。1978年以后,C语言先后移植到大、中、小和微型计算机上。C语言便很快风靡全世界,成为世界上应用最广泛的程序设计高级语言。
以UNIX第7版中的C语言编译程序为基础,1978年,Brian W.Kernighan和Dennis M.Ritchie 合著了影响深远的名著The C Programming Language,这本书中介绍的C语言成为后来广泛使用的C语言版本的基础,它是实际上第一个C语言标准。
1983年,美国国家标准协会(ANSI),根据C语言问世以来各种版本对C语言的发展和扩充,制定了第一个C语言标准草案(’83 ANSI C)。
1989年,ANSI公布了一个完整的C语言标准——ANSI X3.159—1989(常称为ANSI C或C 89)。
1990年,国际标准化组织ISO(International Standard Organization)接受C 89作为国际标准ISO/IEC 9899: 1990,它和ANSI的C 89基本上是相同的。
1999年,ISO又对C语言标准进行了修订,在基本保留原来的C语言特征的基础上,针对应用的需要,增加了一些功能,尤其是C++中的一些功能,并在2001年和2004年先后进行了两次技术修正,它被称为C 99,C 99是C 89的扩充。
1.2.3C语言特点
1.3第一个C程序
要求在屏幕上输出:欢迎加入C语言大家庭!
#include <stdio.h>
//第一个c程序
int main()
{
printf("欢迎加入C语言大家庭!\n");
return 0;
}
输出示意图
程序解读分析
- main是函数的名字,表示“主函数”;每一个C语言程序都必须有一个 main 函数。
- main前面的int表示此函数的类型是int类型(整型),即在执行主函数后会得到一个值(即函数值),其值为整型。
- return 0;的作用是当main函数执行结束前将整数0作为函数值,返回到调用函数处。
- 函数体由花括号{}括起来。
- printf是C编译系统提供的函数库中的输出函数。printf函数中双引号内的字符串″欢迎加入C语言大家庭!″按原样输出。\n是换行符,即在输出″欢迎加入C语言大家庭!″后,显示屏上的光标位置移到下一行的开头。
- 每个语句最后都有一个分号,表示语句结束。
- 在使用函数库中的输入输出函数时,编译系统要求程序提供有关此函数的信息,程序第1行“#include <stdio.h>”的作用就是用来提供这些信息的。stdio.h是系统提供的一个文件名,stdio是standard input & output的缩写,文件后缀.h的意思是头文件(header file),因为这些文件都是放在程序各文件模块的开头的。输入输出函数的相关信息已事先放在stdio.h文件中。
- //表示从此处到本行结束是“注释”,用来对程序有关部分进行必要的说明。在写C程序时应当多用注释,以方便自己和别人理解程序各部分的作用。在程序进行预编译处理时将每个注释替换为一个空格,因此在编译时注释部分不产生目标代码,注释对运行不起作用。注释只是给人看的,而不是让计算机执行的。
在这个地方谈到了注释,那在C语言中可以用什么符号表示呢?
- 以//开始的单行注释
- 以/开始,以/结束的块式注释
1.4C语言关键字
1.5补码
在计算机中,带符号的整型都是以补码形式存在的。
2.输入与输出
2.1输出
printf函数——格式声明
(1) printf函数输出时,务必注意输出对象的类型应与格式说明匹配,否则将会出现错误。
(2) 除了X,E,G外,其他格式字符必须用小写字母,如%d不能写成%D。
(3) 可以在printf函数中的格式控制字符串内包含转义字符,如\n,\t,\b,\r,\f和\377等。
(4) 一个格式声明以“%”开头,以格式字符之一为结束,中间可以插入附加字符(也称修饰符)。
(5) 如果想输出字符“%”,应该在“格式控制字符串”中用连续两个“%”表示,如:printf(″%f%%\n″,1.0/3);
putchar函数
从计算机向显示器输出一个字符。
- 用putchar函数既可以输出可显示字符,也可以输出控制字符和转义字符。
- putchar©中的c可以是字符常量、整型常量、字符变量或整型变量(其值在字符的ASCII代码范围内)。
2.2输入
scanf函数——格式声明
scanf("%类型",地址);
(1) scanf函数中的格式控制后面应当是变量地址,而不是变量名。 应与上述格式说明匹配,否则将会出现错误。
(2)如果在格式控制字符串中除了格式声明以外还有其他字符,则在输入数据时在对应的位置上应输入与这些字符相同的字符。
(3)在用“%c”格式声明输入字符时,空格字符和“转义字符”中的字符都作为有效字符输入。
(4) 在输入数值数据时,如输入空格、回车、Tab键或遇非法字符(不属于数值的字符),认为该数据结束。
getchar函数
向计算机输入一个字符。
- 函数没有参数。
- 函数的值就是从输入设备得到的字符。 只能接收一个字符。
- 如果想输入多个字符就要用多个函数。 不仅可以从输入设备获得一个可显示的字符,而且可以获得控制字符(如回车,空格等)。
- 用getchar函数得到的字符可以赋给一个字符变量或整型变量,也可以作为表达式的一部分。如,putchar(getchar());将接收到的字符输出。
3.数据类型
所谓类型,就是对数据分配存储单元的安排,包括存储单元的长度(占多少字节)以及数据的存储形式。不同的类型分配不同的长度和存储形式。
3.1数据类型分类
常见数据类型:整型,浮点型
char //字符数据类型
short //短整型
int //整形
long //长整型
long long //更长的整形
float //单精度浮点数
double //双精度浮点数
注意:C语言中没有字符串类型
3.2常见数据类型所占内存大小与取值范围
sizeof是c语言中的一种单目操作符,并不是函数。它能够以字节为单位给出操作数的储存大小。所以,我们可以利用这个操作符求出各数据类型的大小。
#include <stdio.h>
int main()
{
printf("%d\n", sizeof(char));
printf("%d\n", sizeof(short));
printf("%d\n", sizeof(int));
printf("%d\n", sizeof(long));
printf("%d\n", sizeof(long long));
printf("%d\n", sizeof(float));
printf("%d\n", sizeof(double));
printf("%d\n", sizeof(long double));
return 0;
}
由上述程序可知各数据类型大小(单位为字节)
说明: C标准没有具体规定各种类型数据所占用存储单元的长度,只要求sizeof(short)≤sizeof(int)≤sizeof(long)≤sizeof(long long),具体由各编译系统自行决定的。 sizeof是测量类型或变量长度的运算符。
- char 1byte
- short 2byte
- int 4byte
- long (int) 4byte(32位平台为4byte,64位平台为8byte)
- long long (int) 8byte
- float 4byte
- double 8byte
- long double 8byte (32位平台为8byte,64位平台为16byte)
整型数据类型 | 缺省形式****的 整型****数据类型 | 字节数 | 取值范围 |
---|---|---|---|
[signed ]int | int | 4 | -2147483648~2147483647 |
unsigned [int] | unsigned | 4 | 0~4294967295 |
[signed] short [int] | short | 2 | -32768~32767 |
unsigned short [int] | unsigned short | 2 | 0~65535 |
[signed ]long [int] | long | 4 | -2147483648~2147483647 |
unsigned long [int] | unsigned long | 4 | 0~4294967295 |
[signed ]long long [int] | long long | 8 | -9223372036854775808~9223372036854775807 |
unsigned long long [int] | unsigned long long | 8 | 0~18446744073709551615 |
3.3字符型数据与ASCII码
3.3.1字符型字符集
ASCII字符集包括:
- 字母: 大写英文字母A~Z,小写英文字母a~z
- 数字: 0~9
- 专门符号: 29个,包括 ! " # & ’ ( ) * + , - . / : ; < = > ? [ \ ] ^ _ ` { | } ~
- 空格符: 空格、水平制表符(tab)、垂直制表符、换行、换页(form feed)
- 不能显示的字符: 空(null)字符(以’\0’表示)、警告(以’\a’表示)、退格(以’\b’表示)、回车(以’\r’表示)等
注意:字符′1′和整数1是不同的概念。 字符′1′只是代表一个形状为′1′的符号,在需要时按原样输出,在内存中以ASCII码形式存储,占1个字节。 而整数1是以整数存储方式(二进制补码方式)存储的,占2个或4个字节。 整数运算1+1等于整数2,而字符′1′+′1′并不等于整数2或字符′2′。
3.3.2ASCII
4变量与常量
4.1概述
生活中的有些值是不变的(比如:圆周率,性别(?),身份证号码,血型等等),有些值是可变的(比如:年龄,体重,薪资)。
不变的值,C语言中用常量的概念来表示,变的值C语言中用变量来表示。
4.2常量
常量常见的包括以下几类:
- 整型常量,例如 12;100;88;0;12345;-365
- 实型常量(包括小数和指数形式),例如 3.14;2.86e3
- 字符常量,例如 普通字符 ‘a’;‘F’;‘2’;’#’;’?’ 转义字符 ‘\n’;’\302’;’\t’
- 字符串常量, 例如 “abc”;“apple”;“FBI”;“CSDN”;“博客”
- 符号常量, 例如 #define PI 3.1416;const常量
- 枚举常量
#include <stdio.h>
//举例
enum Sex
{
MALE,
FEMALE,
SECRET
};
//括号中的MALE,FEMALE,SECRET是枚举常量
int main()
{
3.14;//字面常量
1024;//字面常量
const float pi = 3.14f; //const 修饰的常量
#define MAX 100 //#define的标识符常量
return 0; }
4.3变量
4.3.1变量的属性与使用方法
- 变量代表一个有名字的、具有特定属性的一个存储单元。
- 变量用来存放数据,也就是存放变量的值。
- 在程序运行期间,变量的值是可以改变的。
- 变量必须先定义,后使用。
定义变量方法
int age = 18;
float weight = 55.5f;
char ch = ‘w’;
//类型 变量名 = 值;
4.3.2变量的分类,作用域和生命周期
变量可分为全局变量与局部变量。
通俗点说:
在大括号(代码块)内部定义的变量就是局部变量。
在大括号(代码块)外部定义的变量就是全局变量。
作用域
作用域(scope),程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效或者是可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。
\1. 局部变量的作用域是变量所在的局部范围。
\2. 全局变量的作用域是整个工程。
生命周期
变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段。
\1. 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
\2. 全局变量的生命周期是:整个程序的生命周期。
当局部变量和全局变量同名时,局部变量优先。
#include <stdio.h>
int global = 2021;//全局变量
int main()
{
int local = 2022;//局部变量
//当局部变量和全局变量同名的时候,局部变量优先使用。
int global = 2020;//局部变量
printf("global = %d\n", global);//输出2020
return 0;
}
5.了解字符的奥秘
5.1字符串
"我爱学习!"
"abcdefg"
'FBI,open the door!"
这种由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符串。
注:字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串内容。
要理解\0前先了解一下数组的基本概念
请关注博主另一篇文章:数组的介绍与应用(点击直达)
知道数组概念后看看下面一个程序:
#include <stdio.h>
int main() {
char arr1[] = "FBI";
char arr2[] = { 'F','B','I' };
char arr3[] = { 'F','B','I','\0' };
printf("%s\n", arr1);
printf("%s\n", arr2);
printf("%s\n", arr3);
}
让我们来看看输出结果,arr1与arr3都是输出正常的结果,但是arr2后面多了一些乱七八糟的字符。这是怎么回事呢?原因是“\0”,因为\0是字符串结束的标志并且字符串除了我们可见的内容外,字符串结尾还有个\0,当把数组里的内容以%s字符串形式输出时,是以\0为标志来作为结束的标志,遇到\0字符串输出到这就结束了。所以arr1与arr3能正常输出,而arr2输出异常。输出arr2时由于没有\0,所以编译器会一直往后读直到读到\0才结束输出,所以说arr2"FBI"后的内容都是随机的。
5.2转义字符
除了"\n","\0"这些转义字符,c语言中还有许多其他的转义字符。
描述
BoBo老师教了KiKi学习程序设计基础,他知道C++是带类的C语言,这个“++”主要包含三部分内容:对C语言进行语法上的扩展、面向对象(封装、继承和多态),STL(即模板)。这学期KiKi学习了C和C++,学好他们,其他编程语言都可以很轻松掌握。C和C++的输入有区别,请帮KiKi输出C和C++输出Hello world的代码。
输入描述:
无
输出描述:
printf(“Hello world!\n”);
cout << “Hello world!” << endl;
#include <stdio.h>
int main()
{
printf("printf(\"Hello world!\\n\");\n");
printf("cout << \"Hello world!\" << endl;\n");
return 0;
}
输出 ’ 与 "
#include <stdio.h>
int main() {
printf("%s\n", "\'");//比如输出',"。
printf("%s\n","\"");
}
举个栗子 其中strlen()函数用来求字符个数
#include <stdio.h>
int main()
{
printf("%d\n", strlen("abcdef"));//6
// \t与\32被解析成一个转义字符,一个转义字符算一个字符
printf("%d\n", strlen("c:\test\328\test.c"));//14
return 0;
}
5.3运算符
5.3.1常见运算符归类
两个实数相除的结果是双精度实数,两个整数相除的结果为整数。
%运算符要求参加运算的运算对象(即操作数)为整数,结果也是整数。
5.3.2自增(++)自减(–)运算符
++i,–i 在使用i之前,先使i的值加/减1(先加再用)
i++,i-- 在使用i之后,使i的值加/减1 (先用再加)
5.3.3自动类型转换
不同类型数据间的混合运算
如果一个运算符两侧的数据类型不同,则先自动进行类型转换,使二者成为同一种类型,然后进行运算。整型、实型、字符型数据间可以进行混合运算。规律为:
- +、-、*、/运算的两个数中有一个数为float或double型,结果是double型,因为系统将所有float型数据都先转换为double型,然后进行运算。
- 如果int型与float或double型数据进行运算,先把int型和float型数据转换为double型,然后进行运算,结果是double型。
- 字符(char)型数据与整型数据进行运算,就是把字符的ASCII代码与整型数据进行运算。如果字符型数据与实型数据进行运算,则将字符的ASCII代码转换为double型数据,然后进行运算 。
赋值过程中的类型转换
如果赋值运算符两侧的类型一致,则直接进行赋值。
如果赋值运算符两侧的类型不一致,但都是基本类型时,在赋值时要进行类型转换。类型转换是由系统自动进行的,转换的规则是:
- 将浮点型数据(包括单、双精度)赋给整型变量时,先对浮点数取整,即舍弃小数部分,然后赋予整型变量。
- 将整型数据赋给单、双精度变量时,数值不变,但以浮点数形式存储到变量中。
- 将一个double型数据赋给float变量时,先将双精度数转换为单精度,即只取6~7位有效数字,存储到float型变量的4个字节中。应注意双精度数值的大小不能超出float型变量的数值范围;将一个float型数据赋给double型变量时,数值不变,在内存中以8个字节存储,有效位数扩展到15位。
- 字符型数据赋给整型变量时,将字符的ASCII代码赋给整型变量。
- 将一个占字节多的整型数据赋给一个占字节少的整型变量或字符变量时,只将其低字节原封不动地送到被赋值的变量(即发生“截断”)。
5.3.4强制类型转换
(double)a 将a转换成double型
(int)(x+y) 将x+y的值转换成int型
(float)(5%3) 将5%3的值转换成float型
(int)x+y 只将x转换成整型,然后与y相加
int a; float x,y;double b;
a=(int)x ;
进行强制类型运算(int)x后得到一个int类型的临时值,它的值等于x的整数部分,把它赋给a,注意x的值和类型都未变化,仍为float型。该临时值在赋值后就不再存在了。
- 点赞
- 收藏
- 关注作者
评论(0)