c语言基础篇

目录

目录

1,认识c语言

 2,vs手把手教你使用

3,第一个c语言程序

4,Main函数

5,Printf和库函数

6,数据类型

7,计算机中的单位

8,变量

9,变量的作用域和生命周期

10,字符及ascll编码

11,字符串

12,转义字符

13,注释

14,关系操作符

15,条件操作符

16,逻辑操作符

17,短路


1,认识c语言

语言;人与人交流的工具

包括:汉语,日语,英语~~~~~

那么人和计算机如何交流呢

当然,也是使用语言,人和计算机交流的语言有很多

包括:c语言/c++/java/pythen

其中目前所有的语言中,截止到2024.7.18

c语言排名第二,那很多人就想了解第一名的语言

其实不必,语言都是有互通性的,而且c语言的稳定性还是很靠得住的

接下来对于一个复杂的概念做一些解释

 电脑为什么可以工作

当然是各个部分的齐心协力

可以简单的分为上层和下层

                      如图    :    上层 : 应用软件  列如:qq/ 百度网盘

                                      

                                         下层(底层):操作系统

                                                                                       驱动层

                                                                :硬件

正是由于如此的结构,才使得硬件和我们的显示屏上的操作系统联系起来

而c语言广泛用于底层开发,是一种高级语言

何为高级呢?

任何语言的发展都是由低级到高级

以计算机的发展为例

从二进制指令 到汇编指令 到b语言、再到c语言

像极了汉字从甲骨文发展至今的过程,经历曲折,抵达彼岸

故此语言的排名就并不是那么重要的,毕竟都有很大的互通性

但是发展,必然是不统一的

要不全国至今为什么没有统一语言呢?

考虑到如此因数

c语言的国际标准(ANSIC)应运而生

列如:c89,c99,c11等等

而c语言是一名编译性语言,那么需要哪些步骤呢?

高级点可以写成xxx.c_______xxx.exe

如何完成这样子的转换呢?

首先对xxx.c进行编译然后输出

然后对输出进行连接然后生成xxx.exe

故此,一个好的编译器至关总要

在此,个人推荐GCC,MSVC、(后期有用)

 2,vs手把手教你使用

想在电脑上正常运行c语言

一个趁手的软件少不了

市面上有许许多多的软件

在此我推荐使用vs

即visual stadio

有2019和2022甚至更古老的版本

用2019和2022比较推荐

当然如果有趁手的就用下去就可以了

这两个软件用360软件管家就可以安装不过vs2022可能某些系统不兼容,

2019还是比较通用的

正常安装完成后

第一步打开vs(或其他)

创建新项目

点击后

创建源文件

此时算是打开了vs

若想编写程序则需要进行源代码的添加

在源代码处右键

点击新建项后便出现如下界面

更改为.c为重点

若以.cpp则为c++语法

然后点击添加

便创建完成

3,第一个c语言程序

c语言可以理解为一种语法

而语法规定c语言必须含有main函数

任何语言都是慢慢熟悉的过程

我们不妨写下一个最简单的c语言程序

然后对此进行刨析

main函数是程序的入口

有且只有一个

stdio.h

std:标准

i:input

o:out put

若使用库函数printf,则需要“打招呼"

即在int main 上一行前加#include<stdio.h>

可能很多初学者不能完全理解这很正常

刚开始学英语也是一个一个单词翻译

此处标记重点

语言代码中一定含有main函数

即main()

return 0//在字母和数字见要以空格隔开

如上格式是每一个c语言中必须含有的

没有什么理解不理解的

背下来、背下来背下来!

还有一点要强调的就是全部要使用英文里面的标点

汉语中的标点无法识别

还有一种古老的写法(不是很推荐)

至少十年及以上的书本可能会出现

void main()

这种写法有些编译器无法识别

因此不推荐

4,Main函数

每个 C 语言程序不管有多少行代码

都是从 main 函数开始执行的

main 函数是程序的入口

main 函数也被叫做:主函数。

main 前⾯的 int 表示 main 函数执行结束的时候返回⼀个整型类型的值

所以在 main 函数的最后写 return 0; 正好前后呼应。

• main函数是程序的入口

 • main函数有且仅有⼀个

• 即使⼀个项目中有多个.c⽂件,但是只能有⼀个main函数(因为程序的入口只能有⼀个)

第⼀次写代码,⼀些常见的错误总结:

• main 被写成了mian

• main后边的()漏掉了

• 代码中不能使⽤中⽂符号,⽐如括号和分号

• ⼀条语句结束后,有分号

5,Printf和库函数

代码中使用 printf 函数,实现了在屏幕上的信息的打印。

这里简单的介绍⼀下 printf , printf 是⼀个库函数

它的功能是在标准输出设备(⼀般指屏幕)上进⾏信息的打印。

上⾯的代码是使用 printf 函数打印字符串。

只要把想要打印的⼀串字符放 在双引号中并传递给printf函数就可以打印。 printf函数也可以用来打印其他类型的数据,⽐如:

printf("%d\n", n); //printf打印整型

printf("%c\n", 'q'); //printf打印字符

printf("%lf\n", 3.14); //printf打印双精度浮点型

这里的 %d , %c 等是占位符,会被后边的值替换。

 同时我们在使⽤库函数的时候,是需要包含头文件的

⽐如: printf 函数需要包含的就是 stdio.h 这个头⽂件

具体的方法就是: 1 #include<stdio.h>

那什么是库函数呢?

 为了不再重复实现常见的代码,让程序员提升开发效率

C语言标准规定了⼀组函数,这些函数再由不同的编译器厂商根据标准进⾏实现,提供给程序员使用。

这些函数组成了⼀个函数库,被称为标准库,这些函数也被称为库函数

在这个基础上⼀些编译器厂商可能会额外扩展提供部分函数(这些函数其他编译器不⼀定支持)。

⼀个系列的库函数⼀般会声明在同⼀个头文件中

所以库函数的使用,要包含对应的头文件。

库函数比较多,提前了解可参考链接:https://cplusplus.com/reference/clibrary/

6,数据类型

我们可以问一下自己

为什么写代码?

为了解决生活中的问题

购物,存钱,都需要代码的应用

而应用的类型可能不同

比如购物时需要付款66.6

上高速时扫描车牌号E XX520

因此数据类型应运而生

数据类型分为多种

比如66.6  浮点型

       66  整形

       Q字符

等等

可以分为以下几类

char  字符数据类型         字节1

short  短整型                      2

int        整形                       4

long     长整型                     4

long long  更长的整形           8

float     单精度浮点数            4

double   双精度浮点数            8

虽然int和long字节相同

但是在c语言中规定

size of(long)>=size of (int)

7,计算机中的单位

可能各位都看到了后面标的字节

字节是计算机中的单位

单位还有比特位(bit)

字节(byte)

kb

mb

gb

tb

pb

在这些单位中,bit和byte之间的转化为8

其他都为1024

列如1byte=8bit

1024bit=1kb

我们当下处于一个十进制的世界中

但是计算机仅仅可以理解2进制

因此对于计算机

将十进制转化为二进制

一个比特位用来存储1或者0

通过多个比特位来存储数据

8,变量

在我们的日常生活中,有许许多多变化的值,也有不变的

比如身高,体重,可能一直处于变化

血型,性别就是不变的

而在c语言中

也有相同的概念

被称为变量和常量

而变量又分为全局变量和局部变量

列如下面一串代码

int b=20;//全局变量
int main()
{
int b=1;//局部变量
printf("b=%d",b);
return 0;
}

如这串代码

便可以清楚了解到全局变量和局部变量的大概位置

全局变量(外部)

局部变量(内部)

而在如上程序中出现了全局变量和局部变量

那么如果运行程序

b的值为多少呢

由结果不难看出答案为1

由此可得出结论

当全局变量和局部变量同时出现时

局部变量优先

9,变量的作用域和生命周期

在数学中,我们可能学过函数,而在函数中,我们又了解到了定义域

定义域指该函数自变量的取值范围 有限制作用

而在c语言中也有类似定义域的东西,被命名为作用域

同理也起限制作用

而在上一章中提到

变量分为全局变量和局部变量,不同的变量对应的作用域固然不同

局部变量的作用域是局部变量的作用范围

全局变量全局范围均可用(作用于整个工程)

那么,全局变量和局部变量在内存中存储于哪个区域呢?

一般我们在学习c语言和c++的时候,会关注内存中的三个区域

即:栈区,堆区,静态区

1,局部变量放在内存中的栈区

2,全局变量放在内存中的静态区

3,堆区是用来动态内存管理的

局部变量的生命周期为;进入作用域生命周期开始,出作用域生命周期结束

全局变量的生命周期为整个程序的生命周期

作用域约等于生命周期

10,字符及ascll编码

在键盘上我们可以敲出各种字符如:a,q,@,#等,这些符号都被称为字符

C语⾔中字符是⽤单引号 括起来的,如:'a','b','@'。

我们知道在计算机中所有的数据都是以二进制的形式存储的

那这些字符在内存中分别以什么样的二进制存储的呢?

如果我们每个人自己给这些字符中的每个字符编⼀个⼆进制序列,

这个叫做编码

为了方便大家相互通信,不造成混乱

后来美国国家标准学会(ANSI)出台了⼀个标准 ASCII 编码

C 语言中的字符就遵循了 ASCII 编码的⽅式。

• 字符A~Z的ASCII码值从65~90

• 字符a~z的ASCII码值从97~122

• 对应的⼤⼩写字符(a和A)的ASCII码值的差值是32

• 数字字符0~9的ASCII码值从48~57

• 换行 \n 的ASCII值是:10

• 在这些字符中ASCII码值从0~31 这32个字符是不可打印字符,⽆法打印在屏幕上观察

如果我们想把所有的可打印字符给展现出来的话

不妨尝试一下这段代码

#include <stdio.h>
int main()
{
 int i = 0;
 for (i = 32; i <= 127; i++)
 {
 printf("%c ", i);
 if (i % 16 == 15)
 printf("\n");
 }
 return 0;
}

运行的结果是

11,字符串

在c语言中

形如‘a'  ’b'  ‘c' 等单个字母被命名为字符常量

而形如“abcdef”等则被命名为字符串

在c语言中,有整形,单精度浮点数,字符数据类型

但却没有字符串类型

所以在初始化字符串时与初始化字符相同

列:

char ch=’w‘

char arr[10]

尤为注意的是在[  ] 中可以不写或写大,不可写小

在c语言语法中规定\0是字符串的结束标志

而打印字符串用

printf(“%s\n”,arr);

那么为社么说\0是字符串的结束标志呢?

不妨看下面的一串代码

#define   _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	char arr1[100] = "abcde";
	char arr2[100] = { 'a','b','c','d','e' };
	printf("%s\n", arr1);
	printf("%s\n", arr2);
 
 
 
	return 0;
}

得到的arr1和arr2的结果截然不同,原因就是出于此处

arr2没有\0即在打印过程中会打印字符常量后面的内容,直至出现下一个\0

而字符串默认会附带\0

由此我们可知\0在字符串中非常重要

12,转义字符

转义字符作为c语言的基础在代码的书写过程中经常应用

下面我便列下几个常用的转义字符,在应用中记住

\’用于表示字符常量‘

\“用于表示一个字符内部的双引号

\\用于表示一个反斜杠,防止它们被解释为一个转义序列符

\n换行

\r回车

\t水平制表符

\ddd    ddd表示1-3个八进制的数字

\xdd     dd表示2个16进制数字

如上即是较为重要的转义字符

还有一些不是很重要的

类如

\? 在连续书写多个?中使用,防止他们被解析成三字母词

而在原来的一些编译器中

??)的意思为]

那么如何解决呢?

只需要写成

\?\?)

即为??)

很神奇吧

还有一个很重要的

空格也算字符!

接下来再扩展一些打印符号

%d    打印整形

%c    打印字符

%s     打印字符串

%f    打印float类型的数据

%lf    打印double类型的数据

13,注释

注释是对代码的说明,编译器会忽略注释,也就是说,注释对实际代码没有影响。 注释是给程序员⾃⼰,或者其他程序员看的。

好的注释可以帮我们更好的理解代码,但是也不要过度注释,不要写没必要的注释。

当然不写注释可能会让后期阅读代码的⼈抓狂。

写注释⼀定程度上反应了程序作者的素质,建议⼤家写必要的注释,在未来找⼯作的时候,写代码时 留下必要的注释也会给⾯试官留下更好的印象。

注释的2种形式

C 语⾔的注释有两种表⽰⽅法

/**/ 的形式

第⼀种⽅法是将注释放在 /*...*/ 之间,内部可以分⾏。

 /* 注释 */

 /* 这是一行注释 */

这种注释可以插在行内。

int fopen(char* s /* file name */, int mode);

上⾯⽰例中, /* file name */ ⽤来对函数参数进⾏说明,跟在它后⾯的代码依然会有效执⾏。

这种注释⼀定不能忘记写结束符号 */ ,否则很容易导致错误。

上⾯⽰例中, /* file name */ ⽤来对函数参数进⾏说明,跟在它后⾯的代码依然会有效执⾏。 这种注释⼀定不能忘记写结束符号 */ ,否则很容易导致错误。

printf("a "); /* 注释⼀

printf("b ");

printf("c "); /* 注释⼆ */

printf("d ");

上⾯⽰例的原意是,第⼀⾏和第三⾏代码的尾部,有两个注释。

 但是,第⼀⾏注释忘记写结束符号,导致注释⼀延续到第三⾏结束。

 /**/ 的这个注释也不⽀持嵌套注释,

/* 开始注释后,遇到第⼀个 */ 就认为注释结束了。

// 的形式 第⼆种写法是将注释放在双斜杠 // 后⾯,从双斜杠到⾏尾都属于注释。

这种注释只能是单⾏,可以 放在行首,也可以放在一行语句的结尾。

这是 C99 标准新增的语法。

// 这是一行注释

 int x = 1; // 这也是注释

不管是哪⼀种注释,都不能放在双引号⾥⾯。

双引号里面的注释符号,会成为字符串的⼀部分,解释为普通符号,失去注释作用。

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

 上⾯示例中,双引号⾥⾯的注释符号,都会被视为普通字符,没有注释作用。

注释会被替换

14,关系操作符

C 语言用于比较的表达式,称为 “关系表达式”(relational expression),里面使用的运算符就称 为“关系运算符”(relational operator),主要有下面6个。

• > 大于运算符

• < 小于运算符

• >= 大于等于运算符

• <= 小于等于运算符

• == 相等运算符

• != 不相等运算符

关系表达式通常返回 0 或 1 ,表示真假。 C 语言中, 0 表示假,所有⾮零值表示真

⽐如, 20 > 12 返回 1 , 12 > 20 返回 0

 关系表达式常用于 if 或 while 结构。

注意:相等运算符 == 与赋值运算符 = 是两个不一样的运算符,不要混淆。有时候,可能会不小心写出下面的代码,它可以运行,但很容易出现意料之外的结果。

类如

为了防⽌出现这种错误,有的程序员喜欢将变量写在等号的右边。

这样子的话,编译器会报错

另⼀个需要避免的错误是:多个关系运算符不宜连⽤。

i < j < k 上面例子中,连续使用两个小于运算符

这是合法表达式,不会报错,但是通常达不到想要的结果

即不是保证变量 j 的值在 i 和 k 之间。

因为关系运算符是从左到右计算

所以实际执行的是下面的表达式

  (i < j) < k

上面例子中, i < j 返回 0 或 1

所以最终是 0 或 1 与变量 k 进行比较

15,条件操作符

条件操作符也叫三⽬操作符,需要接受三个操作数的,形式如下:

exp1 ? exp2 : exp3

条件操作符的计算逻辑是:

如果 exp1 为真, exp2 计算,计算的结果是整个表达式的结果

如果 exp1 为假, exp3 计算,计算的结果是整个表达式的结果

类如

#define   _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
main()
{
    printf("猜下我的年龄;\n");
    int a = 0;
    scanf("%d", &a);
    a < 18 ? printf("嘻嘻嘻") : printf("我有那么老嘛");
 
    return  0;
}

来看一下运行结果吧

想必通过这个代码,大家便已经对条件关系符有了充分的认识,那么继续进行逻辑操作符的学习吧

16,逻辑操作符

逻辑运算符提供逻辑判断功能,⽤于构建更复杂的表达式,主要有下面三个运算符。

• ! :逻辑取反运算符(改变单个表达式的真假)。

• && :逻辑与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。

• || :逻辑或运算符,就是或者的意思(两侧至少有⼀个表达式为真,则为真,否则为假)。

注:C语言中,非0表示真,0表示假

17,短路

C语⾔逻辑运算符还有⼀个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是 保证的。

如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值。

这种情况称为“短路”。

if(month >= 3 && month <= 5)

表达式中&& 的左操作数是 month >= 3 ,右操作数是 month = 3 的结果是0的时候,即使不判断 month <= 5 ,整个表达式的结果也是0。 所以,对于&&操作符来说,左边操作数的结果是0的时候,右边操作数就不再执行。

if(month == 12 || month==1 || month == 2)

如果month == 12,则不用再判断month是否等于1或者2,整个表达式的结果也是1。 所以, || 操作符的左操作数的结果不为0时,就无需执行右操作数。

像这种仅仅根据左操作数的结果就能知道整个表达式的结果

不再对右操作数进行计算的运算称为短路求值。

  • 19
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值