初入C语言_1

目录

1.什么是C语言?

2.一个简易的C语言程序

3.C语言中的数据类型

4.常量与变量

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


1.什么是C语言?

首先我们先来看一些概念,虽然标准的概念总是枯燥无味令人头痛,但是毕竟是对其定义标准的,系统的概括与讲解,大家有没有发现就算概念再枯燥到没人有兴趣看,但是依旧处于书本中打头阵的位置。

C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易 的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程 语言。 尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的 C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及 超级电脑等作业平台。 二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制 定了一套完整的美国国家标准语法,称为ANSI C,作为C语言最初的标准。 [1] 目前2011年12月8 日,国际标准化组织(ISO)和国际电工委员会(IEC)发布的C11标准是C语言的第三个官方标 准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉 字编程。 C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程语言有所不同。 其编译器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等。

不同国家的人们在交流时有着不同的语言使得人们有交流障碍,随着全球化的发展,各国文化经济政治不断进行交流借鉴,但是语言又是一大最主要的难题,所以有了一个通用语言:英语。这一标准的产生使得全球本国对外国的语言有了一定的统一化,那么计算机也是如此,想要实现任何计算机的交流,以便计算机为你解决复杂的问题,那你首先就要能和计算机“说上话”,经过几十年的发展,出现了许多编程语言,但是如果都是一大独大,那在做跨国贸易的时候岂不是会出现很多不必要的麻烦?于是又像人们说的语言一样,对编程语言进行了统一化标准,也就是C语言。

2.一个简易的C语言程序

讲完概念之后,是否脑海中对C语言有了一些畅想呢?那么C语言程序究竟该如何实现呢,给大家列举一个最简单的程序:

#include <stdio.h>

int mian()
{
    printf("hello world");
    return 0;
}
注解:
//#include <>是代表引用头文件,我们使用了C语言函数库中的文件后需要引用头文件以便下文的printf("");-打印函数得以实现,而stdio.h就是头文件
//mian是程序的入口,整个程序有且只能有一个main函数
//main函数的写法如下:
//int main()
//{
//    (输入你的代码)
//    return 0;
//}

这样我们就实现了一个最简单的C语言程序,运行结果就会在你的编译器屏幕中打印一个“hello world”,神奇吗?

3.C语言中的数据类型

介绍此概念前先来看一段代码:

#include <stdio.h>

int main()
{
    int a = 10;
    int b = 20;
    
    int c = a+b;
    printf("%d",c);
    return 0; 
}

没有学过C语言的朋友大致看一下也应该能猜到这段代码实现的是什么功能吧?没错,让两个整数相加。(注释:大家可能注意到这里的printf 和上一个程序里的printf有些不同,上一个printf("hello world")中没有逗号,更没有逗号后面的c,由C语言语法规定,这样写是代表想打印存在一个变量中的值,%d代表打印整形,后面的c就好比匹配前面的%d,将c中的30打印出来。)

爱问问题的朋友可能要问了:那整数在C语言中是如何表示的呢?小数又是如何表示的呢?符号又是如何表示的呢?

C语言为了解决大家的疑问,给出了对于数据类型的如下定义:

char      //字符数据类型
short     //短整形
int       //整形
long      //长整形
long long //更长的整形
float     //单精度浮点数
double    //双精度浮点数

这就是我们在写程序的时候用得到的数据类型,使用char来定义字符,例如'a','b','c'...,大家可以看到short,int,long,long long,都叫做整形,没错,他们四个只是在大小方面存在区别,代表的都是对整数的定义,最常用的是int,使用float和double来定义小数,单精度和双精度和那四个整形类型大同小异,只是在表示范围和内存占用大小等存在差异,我后期会展开研究。

好,相信大家不想值局限于认识他们,更想要进一步了解他们,我们知道每一个数据类型都有对应的大小,那我们就通过一段代码来看看这些数据类型的大小吧。

#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));
    return 0;
}
注释:
//sizeof()是C语言设计来专门用于求大小的工具,返回的依旧是一个整数,所以前面用%d来写
//转义字符\n,代表一个换行,等同于我们写文档时敲一下回车

那么此程序运行的结果如何呢?我们可以用自己的编译器来测试一下

通过运行结果我们可以看出每个数据类型在内存中的大小,其单位是字节(byte),在32位机器和64位机器上它们的内存可能会有不同,不过这种问题我们现阶段不必过多考虑。

存在这么多的数据类型就是为了让我们在定义数据时能有更多的选择。

4.常量与变量

很简单的两个概念,大家先自行在脑海中给出定义,所谓变量就是可变的量,例如薪水,年龄,成绩,地球上的人口数量等。常量就是不可变的量,例如我们的身高,体重,血型,圆周率等。刚刚我们在数据类型那个板块定义的a,b,c都是变量。

(1)定义变量的方法

在C语言当中如何定义一个变量呢?

char ch;
int a;
float f;

数据类型+空格+变量名称,就是C语言对于变量定义的语法要求,是不是很简单呢?

(2)变量的分类

了解完变量的定义,我们接下来看看变量的分类:在C语言当中,变量分为局部变量和全局变量,所谓局部变量就是在main函数中定义的变量,只能在main函数中使用,全局变量就是在main函数外部定义的变量,在整个工程都能使用,我用代码演示一下:

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

如运行结果所示,我们在main函数内打印一个其外部的变量,按理说是不可行的,但是程序却完好的运行,说明语法是正确的,也就是全局变量可以在main函数内部使用。

讲到这爱提问的朋友又说了:如果局部变量和全局变量都使用了同一名称的变量,那会产生什么结果呢?其思路用代码翻译如下:

int b = 19;
int mian()
{
    int a = 10;
    int b = 20;
    printf("%d\n",a);
    printf("%d\n",b);
    return 0;
}

大家可以先自行思考一下,下面我给出编译结果

是不是有的朋友认为b的值应该是19,但是显然是优先使用的局部变量,这里涉及到了一个知识点:在局部变量和全局变量名称相同的时候,局部变量优先使用,所以打印的是20。

(3)变量的使用

下面再来通过一段代码加深一下对变量的记忆和使用吧

#include <stdio.h>
int main()
{
    int num1 = 0;
    int num2 = 0;
    int sum = 0;
    printf("请输入你想相加的两个数:");
    scanf("%d %d",&num1,&num2);
    sum = num1 + num2;
    printf("%d\n",sum);
}
注释:
//scanf也是和printf一样的库函数,其主要作用是录入用户在键盘敲出的数字、字符、符号等
//scanf函数的头文件也同printf一样为stdio.h,所以不必重复引

这个程序就是上面数字相加的"升级版",相加的对象由用户来决定,看到这里是不是感觉很简单呢?大家可以在自己的编译器上敲一下这些简单的代码,相信你们很快就会上手。

(4)接下来呢,我们来介绍一下变量的作用域和生命周期

所谓作用域就是一个变量在哪些区域内由定义,出了这个区域定义就会失效。                           

1. 局部变量的作用域是变量所在的局部范围。 2. 全局变量的作用域是整个工程。

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

1. 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。 2. 全局变量的生命周期是:整个程序的生命周期。

(5)常量

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

①字面常量 :就是所谓“不可改变”的量,如上文讲到的血型、体重、圆周率等。

②const 修饰的常变量 :如下代码所示:

const int a;

const修饰变量后,a就具有常属性,后面就不可再改变a,用它的目的好像是给a带上了保护罩一样。

③#define 定义的标识符常量 :如下代码所示:

#define MAX 100

一般用来定义全局变量,当遇到许多地方都要用同一个变量,但要修改它时还要处处修改,为了避免这种麻烦我们可以在mian函数外部定义一个统一的,需要修改时直接该它就可以。

④枚举常量:如下代码所示:

enum Sex
{
 MALE,
 FEMALE,
 SECRET
};

所谓枚举常量就是列举出可能用得到的量,enum+空格+名称 就代表定义一个枚举常量,大家会发现这里面的三个变量并没有被赋值,因为语法规定从上到下从0开始自动赋值,所以MALE=0;FEMALE=1;SECRET=2;但是大家有没有发现这样有很大的局限性,我们有时候不想让它从0开始,那也可以自行对其赋值,但是它一直遵循的是由上到下递增1,例如:

#include <stdio.h>
enum Sex
{
    MALE = 1,
    FEMALE,
    SECERT
};
int main()
{
    printf("%d\n", MALE);
    printf("%d\n", FEMALE);
    printf("%d\n", SECERT);
    return 0;
}

对定义之后下面量依次递增,这样打印出来就是1,2,3。

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

(1)字符串

如我们文章刚开篇的时候写的那个简易程序

printf("hello world\n");

这种由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符串。 注:字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串内容。

我们之前只讲解了如何把一个常量存到变量里,但是一个字符串有许多常量呀,我们如何存储呢?

这里我们引入数组的概念:(注:只是为讲解涉及到的知识点,并不会深入,后期会专门讲解)

数组(array)就是一组数,存在内存当中一组挨着的内存块,方便存入一串数或字符。

数据类型+空格+名称[]; 就是数组的定义,[]里面输入数字代表想存入数或字符的个数。如果不输入,计算机会自动根据后面{}或""里的个数自动赋值。

#include <stdio.h>
int main()
{
    char arr1[] = "bit";
    char arr2[] = {'b', 'i', 't'};
    char arr3[] = {'b', 'i', 't', '\0'};
    printf("%s\n", arr1);
    printf("%s\n", arr2);
    printf("%s\n", arr3);
    return 0;
}
//注释:
//下面代码,打印结果是什么?为什么?(突出'\0'的重要性)
//存入字符串可以用"xy"直接存一串字符,也可以用{'x','y'}一个一个存

大家可以先自行思考一下,我给大家运行结果:

如上文讲字符串是由'\0'为结束标志,跟之前讲过的'\n'一样同为转义字符,只有遇到'\0'才会停止,定义"bit"时会自动加入'\0',所以第一个程序正常打印bit,但是第二个程序按字符单个存储时必须加上'\0',不然程序总到't'时不会停止,往后不知道在哪遇到'\0'后停止,所以打印的是随机值,第三个就是正确的,和第一个结果一样,很简单吧。

(2)转义字符

如果我想在屏幕上打印一个文件的路径:例如:c:\code\test.c

该如何书写呢?打印出来是什么呢?该字符串的个数是多少呢?大家可以在编译器上自行测试。我直接给出大家结果:

咦?为什么会显示这么奇怪的东西?大家可以和要打印的字符串对比,\t好像被屏蔽了,这就是我们现在要引入的概念:转义字符,顾名思义就是转变意思的字符。

C语言中的转义字符有很多,如下:

转义字符释义
\?在书写连续多个问号时使用,防止他们被解析成三字母词
\'用于表示字符常量'
\“用于表示一个字符串内部的双引号
\\用于表示一个反斜杠,防止它被解释为一个转义序列符。
\a警告字符,蜂鸣
\b退格符
\f进纸符
\n换行
\r回车
\t水平制表符
\v垂直制表符
\dddddd表示1~3个八进制的数字。 如: \130 X
\xdddd表示2个十六进制数字。 如: \x30 0

所以刚才的程序要想正常运行,我们只需在\t前在再加一个\即可。

了解过这些以后,我们来看这样一道题:
问题1:在屏幕上打印一个单引号',怎么做?
问题2:在屏幕上打印一个字符串,字符串的内容是一个双引号“,怎么做?

#include <stdio.h>
int main()
{
    printf("%c\n", '\'');
    printf("%s\n", "\"");
    return 0;
}
//注释:
//%c %s同%d一样也是为了匹配逗号后面的字符和字符串,大家用多了就会记住
//字符要用单引号,字符串用双引号,是不是和英语的单复数比较像呢?

看完这些详细大家对于转义字符已经有了个比较深刻的认识了,接下来我们来看一道笔试题:

#include <stdio.h>
int main()
{
    printf("%d\n", strlen("abcdef"));
    printf("%d\n", strlen("c:\test\328\test.c"));
    return 0;
}
//strlen是计算字符串长度的函数,自动给字符串结尾处加入'\0'

大家可以思考一下答案,下面给出解析:第一个打印相信大家都会做,答案是6,但是第二个可能有一些困难,也是许多程序小白刚开始会跳进的坑,我用一张图片来为大家讲一下:

没错,答案是14,\t与\32都是转义字符,根据上面的转义字符表不难看出,可能大家唯一的疑问就是为什么\32 8算是两个字符呢?转义字符\ddd表示1~3个八进制数,而八进制数不包括8,所以不能涵盖其中,所以分为两个字符。

(3)注释

1. 代码中有不需要的代码可以直接删除,也可以注释掉

2. 代码中有些代码比较难懂,可以加一下注释文字,比如:

#include <stdio.h>
int Add(int x, int y)
{
    return x+y;
}
/*C语言风格注释
int Sub(int x, int y)
{
    return x-y;
}
*/
int main()
{
    //C++注释风格
    //int a = 10;
    //调用Add函数,完成加法
    printf("%d\n", Add(1, 2));
    return 0;
}
//注释:
//以上用到了函数的调用,后期会展开讲,这里只是简单介绍注释的功能

细心的大家肯定发现了我在每段代码下面加了注释,注释有两种风格:① C语言风格的注释 /*xxxxxx*/ 缺陷:不能嵌套注释 C++风格的注释,语法规定/*会和第一个遇到的*\匹配,所以这类注释方式最好用一次,避免ma麻烦。②C++风格的注释 //xxxxxxxx 可以注释一行也可以注释多行。

 

好啦,本次的内容到这就结束啦,学习了这么久肯定很累,休息一下,我们下次再见吧,拜拜~

  • 10
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值