【C初阶】第一篇——初识C语言(万字篇,带你敲响C语言的大门)(一)

简介: 【C初阶】第一篇——初识C语言(万字篇,带你敲响C语言的大门)

前言


原本打算是上一年写C语言这个系列的,由于本人比较懒,再加上学校的事比较多,所以就拖到了现在,前段时间是想着不更新这部分内容的,不过总感觉学的不踏实,缺了点什么,

所以打算利用10余天时间把C语言系列更新完,和大家一起学习进步!!!

话不多说,直接开卷(本篇会概述一下C语言的各个语法,后面细讲)

image.png

什么C语言?


C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台

C语言是一种面向过程的编程语言,与java,c++等面向对象的编程语言有所不同。

数据类型  


char                 //字符数据类型

short                //短整型

int                    //整形

long                  //长整形

long long          //更长的整形

float                  //单精度浮点数

double              //双精度浮点数注:C语言中有字符串类型嘛?

C语言中没有字符串类型,C++中有

每种类型的大小

image.png

这里我简单拓展下,

bit              比特

byte           字节 =8bit

kb              1024byte

mb             1024kb

gb              1024mb

tb               1024gb

pb              1024tb

想更深入的了解其中的关系和取值范围,可以看我写的计算机组成原理.

变量和常量


生活中的有些值是不变的(比如:圆周率,性别,身份证号码,血型等)

有些值是可变的(比如:年龄,体重,薪资).

不变的值,C语言中用常量的概念来表示,变得值C语言中用变量来表示。

定义变量的方法  


int age=150;

float weight=45.5f;

char ch='w';

变量的分类  


  • 局部变量
  • 全局变量
int a = 2022;//全局变量
int b = 2021;//全局变量
int main()
{
  //test1();
  //思考一下a等于哪个值?
  int a = 2023;//局部变量
  printf("%d\n", a);
  printf("%d", b);
  return 0;
}

image.png

知识加油站

全局变量:在函数外定义的变量;使用范围:从定义开始到本源文件结束;

局部变量:在一个函数内定义的变量;使用范围:定义该变量的函数内

简单了解

1.使用全局变量会占用更多的内存(因为其生命期长),不过在计算机配置很高的今天,这个不成为什么问题,除非使用的是巨大对象的全局变量,能避免就一定要避免。


2.使用全局变量程序运行时速度更快一些(因为内存不需要再分配),同样现在也快不了多少。


3.全局变量全部存放在静态存储区,在程序开始执行时给全局变量分配存储区,程序行完毕就释放。


4.局部变量可以和全局变量重名,但是局部变量会屏蔽全局变量。在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。根据使用范围来区分的。

变量的作用域和生命周期


作用域

作用域,程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域.

1.局部变量的作用域:变量所在的局部范围

2.全局变量的作用域:整个工程

生命周期

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

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

2.全局变量的生命周期:整个程序的生命周期

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

image.png

常量


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

  • 字面常量
#include<stdio.h>
int main()
{
  3.14;//字面常量
  2021;
  return 0;
}
  • const修饰的常变量
#include<stdio.h>
int main()
{
  const int a=10;//const修饰的常变量
  //const修饰的能修改嘛?
  a=50;
  return 0;
}
//结果:不能修改,左值指定const对象
  • #define定义的标识符常量
#include<stdio.h>
#define MAX 100//标识符常量
int main()
{
  printf("%d\n",MAX);
  return 0;
}
  • 枚举常量
enum Sex
{
  //初始化
  MALE=5,
  FEMALE=12,
  SECRET
};
int main()
{
  enum Sex s;
   //未初始化;从0开始依次增长
  printf("%d\n", MALE);//0
  printf("%d\n", FEMALE);//1
  printf("%d\n", SECRET);//2
  //可以直接赋值嘛?:不可以但是可以初始化
  MALE = 5;//不可以
  //初始化后的值
  printf("%d\n", MALE);//5
  printf("%d\n", FEMALE);//12
  printf("%d\n", SECRET);//13
  return 0;
}

字符串


“hello bit.\n"

这种由双引号引起来的一串字符称为字符串面值,或者简称字符串.

注:字符串的结束标志是一个\0的转义字符.在计算字符串长度的时候\0是结束标志,不算作字符串内容。

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;
}

image.png

第二个没有\0也就是结束标志,所以会出现"烫烫烫"这些字;

image.png

我们来测试一下,字符串长度

image.png

a2中没有\0就没有结束字符,所以会出现随机数;

a1数字是5,说明\0不算进字符串内容

我们这里拓展一下,sizeof

image.png

sizeof把\0算进字符串长度中,strlen则不算入;

strlen 是一个函数,它用来计算指定字符串 str 的长度,但不包括结束字符(即 null 字符)。其原型如下面的代码所示:

size_t strlen(char const* str);

也正因为 strlen 是一个函数,所以需要进行一次函数调用,调用示例如下面的代码所示:

1. char sArr[] = "ILOVEC";
2. /*用strlen()求长度*/
3. printf("sArr的长度=%d\n", strlen(sArr));

很显然,上面示例代码的运行结果为 6(因为不包括结束字符 null)。这里需要特别注意的是,函数 strlen 返回的是一个类型为 size_t 的值,从而有可能让程序导致意想不到的结果,如下面的示例代码所示:

/*判断一*/
if(strlen(x)>= strlen(y))
{
}
/*判断二*/
if(strlen(x)- strlen(y)>= 0)
{
}

从表面上看,上面的两个判断表达式完全相等,但实际情况并非如此。其中,判断表达式一没什么问题,程序也能够完全按照预想的那样工作;但判断表达式二的结果就不一样了,它将永远是真,这是为什么呢?


原因很简单,因为函数 strlen 的返回结果是 size_t 类型(即无符号整型),而 size_t 类型绝不可能是负的。因此,语句“if(strlen(x)-strlen(y)>=0)”将永远为真。


关键字 sizeof 是一个单目运算符,而不是一个函数。与函数 strlen 不同,它的参数可以是数组、指针、类型、对象、函数等,如下面的示例代码所示:

char sArr[] = "ILOVEC";
/*用sizeof求长度*/
printf("sArr的长度=%d\n", sizeof(sArr));

相对于函数 strlen,这里的示例代码运行结果为 7(因为它包括结束字符 null)。同时,对 sizeof 而言,因为缓冲区已经用已知字符串进行了初始化,其长度是固定的,所以 sizeof 在编译时计算缓冲区的长度。也正是由于在编译时计算,因此 sizeof 不能用来返回动态分配的内存空间的大小。

转义字符


假如我们想打印一个目录:c:\code\test.c\n

我们一般会这样写:

int main()
{
  printf("c:\code\test.c\n");
  return 0;
}

运行结果却是:

image.png

这里就不得不提一下转义字符了。转义字符顾名思义就是转变意思。

下面看一些转义字符。

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

我这里只举几个常见的,大家感兴趣可以下去试试

int main()
{
  int a = 4, b = 6;
    printf("%d\n", a);//换行
    printf("%d\t%d\n", a, b);//水平制表符
    printf("%c\n", '\'');//用于表示字符常量
    printf("%s\n", "\"");//用于表示一个字符串内部的双引号
  return 0;
}

image.png

思考题:

#include <stdio.h>
int main()
{
    printf("%d\n", strlen("abcdef"));//6
    // \32被解析成一个转义字符
    printf("%d\n", strlen("c:\test\328\test.c"));//14
    return 0;
} 



相关文章
|
存储 编译器 C语言
【C初阶】第一篇——初识C语言(万字篇,带你敲响C语言的大门)(二)
【C初阶】第一篇——初识C语言(万字篇,带你敲响C语言的大门)
【C初阶】第一篇——初识C语言(万字篇,带你敲响C语言的大门)(二)
|
Java 编译器 程序员
初识C语言之概念认知篇——带你开启编程世界的大门!
初识C语言之概念认知篇——带你开启编程世界的大门!
333 0
初识C语言之概念认知篇——带你开启编程世界的大门!
|
算法 程序员 C语言
C语言基础——五分钟打开递归大门
概念👏 什么是递归?网上用的例子是“从前有座山,山上有座庙……”,实际上程序调用自身的编程技巧就是递归,接地气一点就是套娃(包子馅的包子,它的极限是馒头)。
C语言基础——五分钟打开递归大门
|
Web App开发 算法 小程序
帮我妹一 jio 踹开了 C 语言的大门,从此学习的路上不再迷茫不再彷徨(史上最强 C语言学习路线)
帮我妹一 jio 踹开了 C 语言的大门,从此学习的路上不再迷茫不再彷徨(史上最强 C语言学习路线)
134 0
帮我妹一 jio 踹开了 C 语言的大门,从此学习的路上不再迷茫不再彷徨(史上最强 C语言学习路线)
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
34 3
|
7天前
|
C语言
c语言调用的函数的声明
被调用的函数的声明: 一个函数调用另一个函数需具备的条件: 首先被调用的函数必须是已经存在的函数,即头文件中存在或已经定义过; 如果使用库函数,一般应该在本文件开头用#include命令将调用有关库函数时在所需要用到的信息“包含”到本文件中。.h文件是头文件所用的后缀。 如果使用用户自己定义的函数,而且该函数与使用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数做声明。 如果被调用的函数定义出现在主调函数之前可以不必声明。 如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必多所调用的函数在做声明
22 6
|
26天前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
34 10
|
20天前
|
存储 算法 程序员
C语言:库函数
C语言的库函数是预定义的函数,用于执行常见的编程任务,如输入输出、字符串处理、数学运算等。使用库函数可以简化编程工作,提高开发效率。C标准库提供了丰富的函数,满足各种需求。
|
25天前
|
机器学习/深度学习 C语言
【c语言】一篇文章搞懂函数递归
本文详细介绍了函数递归的概念、思想及其限制条件,并通过求阶乘、打印整数每一位和求斐波那契数等实例,展示了递归的应用。递归的核心在于将大问题分解为小问题,但需注意递归可能导致效率低下和栈溢出的问题。文章最后总结了递归的优缺点,提醒读者在实际编程中合理使用递归。
53 7
|
25天前
|
存储 编译器 程序员
【c语言】函数
本文介绍了C语言中函数的基本概念,包括库函数和自定义函数的定义、使用及示例。库函数如`printf`和`scanf`,通过包含相应的头文件即可使用。自定义函数需指定返回类型、函数名、形式参数等。文中还探讨了函数的调用、形参与实参的区别、return语句的用法、函数嵌套调用、链式访问以及static关键字对变量和函数的影响,强调了static如何改变变量的生命周期和作用域,以及函数的可见性。
29 4