初入C语言_1_/、入了“c'′-程序员宅基地

技术标签: 学生  编译器  c语言  字符串  编程语言  程序小白  

目录

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 垂直制表符
\ddd ddd表示1~3个八进制的数字。 如: \130 X
\xdd dd表示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 可以注释一行也可以注释多行。

 

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_55805679/article/details/117651631

智能推荐

获取大于等于一个整数的最小2次幂算法(HashMap#tableSizeFor)_整数 最小的2的几次方-程序员宅基地

文章浏览阅读2w次,点赞51次,收藏33次。一、需求给定一个整数,返回大于等于该整数的最小2次幂(2的乘方)。例: 输入 输出 -1 1 1 1 3 4 9 16 15 16二、分析当遇到这个需求的时候,我们可能会很容易想到一个"笨"办法:..._整数 最小的2的几次方

Linux 中 ss 命令的使用实例_ss@,,x,, 0-程序员宅基地

文章浏览阅读865次。选项,以防止命令将 IP 地址解析为主机名。如果只想在命令的输出中显示 unix套接字 连接,可以使用。不带任何选项,用来显示已建立连接的所有套接字的列表。如果只想在命令的输出中显示 tcp 连接,可以使用。如果只想在命令的输出中显示 udp 连接,可以使用。如果不想将ip地址解析为主机名称,可以使用。如果要取消命令输出中的标题行,可以使用。如果只想显示被侦听的套接字,可以使用。如果只想显示ipv4侦听的,可以使用。如果只想显示ipv6侦听的,可以使用。_ss@,,x,, 0

conda activate qiuqiu出现不存在activate_commandnotfounderror: 'activate-程序员宅基地

文章浏览阅读568次。CommandNotFoundError: 'activate'_commandnotfounderror: 'activate

Kafka 实战 - Windows10安装Kafka_win10安装部署kafka-程序员宅基地

文章浏览阅读426次,点赞10次,收藏19次。完成以上步骤后,您已在 Windows 10 上成功安装并验证了 Apache Kafka。在生产环境中,通常会将 Kafka 与外部 ZooKeeper 集群配合使用,并考虑配置安全、监控、持久化存储等高级特性。在生产者窗口中输入一些文本消息,然后按 Enter 发送。ZooKeeper 会在新窗口中运行。在另一个命令提示符窗口中,同样切换到 Kafka 的。Kafka 服务器将在新窗口中运行。在新的命令提示符窗口中,切换到 Kafka 的。,应显示已安装的 Java 版本信息。_win10安装部署kafka

【愚公系列】2023年12月 WEBGL专题-缓冲区对象_js 缓冲数据 new float32array-程序员宅基地

文章浏览阅读1.4w次。缓冲区对象(Buffer Object)是在OpenGL中用于存储和管理数据的一种机制。缓冲区对象可以存储各种类型的数据,例如顶点、纹理坐标、颜色等。在渲染过程中,缓冲区对象中存储的数据可以被复制到渲染管线的不同阶段中,例如顶点着色器、几何着色器和片段着色器等,以完成渲染操作。相比传统的CPU访问内存,缓冲区对象的数据存储和管理更加高效,能够提高OpenGL应用的性能表现。_js 缓冲数据 new float32array

四、数学建模之图与网络模型_图论与网络优化数学建模-程序员宅基地

文章浏览阅读912次。(1)图(Graph):图是数学和计算机科学中的一个抽象概念,它由一组节点(顶点)和连接这些节点的边组成。图可以是有向的(有方向的,边有箭头表示方向)或无向的(没有方向的,边没有箭头表示方向)。图用于表示各种关系,如社交网络、电路、地图、组织结构等。(2)网络(Network):网络是一个更广泛的概念,可以包括各种不同类型的连接元素,不仅仅是图中的节点和边。网络可以包括节点、边、连接线、路由器、服务器、通信协议等多种组成部分。网络的概念在各个领域都有应用,包括计算机网络、社交网络、电力网络、交通网络等。_图论与网络优化数学建模

随便推点

android 加载布局状态封装_adnroid加载数据转圈封装全屏转圈封装-程序员宅基地

文章浏览阅读1.5k次。我们经常会碰见 正在加载中,加载出错, “暂无商品”等一系列的相似的布局,因为我们有很多请求网络数据的页面,我们不可能每一个页面都写几个“正在加载中”等布局吧,这时候将这些状态的布局封装在一起就很有必要了。我们可以将这些封装为一个自定布局,然后每次操作该自定义类的方法就行了。 首先一般来说,从服务器拉去数据之前都是“正在加载”页面, 加载成功之后“正在加载”页面消失,展示数据;如果加载失败,就展示_adnroid加载数据转圈封装全屏转圈封装

阿里云服务器(Alibaba Cloud Linux 3)安装部署Mysql8-程序员宅基地

文章浏览阅读1.6k次,点赞23次,收藏29次。PS: 如果执行sudo grep 'temporary password' /var/log/mysqld.log 后没有报错,也没有任何结果显示,说明默认密码为空,可以直接进行下一步(后面设置密码时直接填写新密码就行)。3.(可选)当操作系统为Alibaba Cloud Linux 3时,执行如下命令,安装MySQL所需的库文件。下面示例中,将创建新的MySQL账号,用于远程访问MySQL。2.依次运行以下命令,创建远程登录MySQL的账号,并允许远程主机使用该账号访问MySQL。_alibaba cloud linux 3

excel离散度图表怎么算_excel离散数据表格-Excel 离散程度分析图表如何做-程序员宅基地

文章浏览阅读7.8k次。EXCEL中数据如何做离散性分析纠错。离散不是均值抄AVEDEV……=AVEDEV(A1:A100)算出来的是A1:A100的平均数。离散是指各项目间指标袭的离散均值(各数值的波动情况),数值较低表明项目间各指标波动幅百度小,数值高表明波动幅度较大。可以用excel中的离散公式为STDEV.P(即各指标平均离散)算出最终度离散度。excel表格函数求一组离散型数据,例如,几组C25的...用exc..._excel数据分析离散

学生时期学习资源同步-JavaSE理论知识-程序员宅基地

文章浏览阅读406次,点赞7次,收藏8次。i < 5){ //第3行。int count;System.out.println ("危险!System.out.println(”真”);System.out.println(”假”);System.out.print(“姓名:”);System.out.println("无匹配");System.out.println ("安全");

linux 性能测试磁盘状态监测:iostat监控学习,包含/proc/diskstats、/proc/stat简单了解-程序员宅基地

文章浏览阅读3.6k次。背景测试到性能、压力时,经常需要查看磁盘、网络、内存、cpu的性能值这里简单介绍下各个指标的含义一般磁盘比较关注的就是磁盘的iops,读写速度以及%util(看磁盘是否忙碌)CPU一般比较关注,idle 空闲,有时候也查看wait (如果wait特别大往往是io这边已经达到了瓶颈)iostatiostat uses the files below to create ..._/proc/diskstat

glReadPixels读取保存图片全黑_glreadpixels 全黑-程序员宅基地

文章浏览阅读2.4k次。问题:在Android上使用 glReadPixel 读取当前渲染数据,在若干机型(华为P9以及魅族某魅蓝手机)上读取数据失败,glGetError()没有抓到错误,但是获取到的数据有误,如果将获取到的数据保存成为图片,得到的图片为黑色。解决方法:glReadPixels实际上是从缓冲区中读取数据,如果使用了双缓冲区,则默认是从正在显示的缓冲(即前缓冲)中读取,而绘制工作是默认绘制到后缓..._glreadpixels 全黑