第1章 初识C语言

article/2025/9/30 8:18:18

目录

  • 1. 语言的发展:
  • 2. C 语言国际标准
  • 3. 第一个C语言 程序
  • 4. 数据类型
  • 5. 常量、变量
  • 6. 局部变量、全局变量
  • 7. 字符串 + 转义字符 + 注释
    • 7.1 字符串
    • 7.2 转义字符
    • 7.3 注释
  • 8. 常见关键字
      • 8.1 关键字 typedef
      • 8.2 关键字 static
  • 9. #define 定义常量和宏
  • 10. #define 和 typedef 的区别


1. 语言的发展:

【二进制语言】

硬件 – 电:正电(1)、负电(0)

101010000101000111001 – 手册 ------> 低级语言

101011011101 – ADD – 助记符 – 【汇编语言】

【B语言】

【C语言】、【C++】 …… 高级语言 -------> 高级语言

2. C 语言国际标准

国际标准 --> ANSI C - C89 - > C90 -> C98

C99 / C11 并不流行 – 不少编译器不支持

3. 第一个C语言 程序

// 包含一个叫stdio.h的文件
// std - 标准 standard input output#include <stdio.h>
// int 整型的意思
// main 前面的int表示 main函数调用返回一个整型值。
int main()   // 主函数 - 程序入口,main函数有且仅有一个
{	// 函数 - print function  -- printf - 打印函数// 库函数 - C语言本身提供给我们使用的函数// 别人的东西 - 打招呼printf("hehe\n");return 0;   // 返回 0
}// 过时写法
// void main()
// {}

4. 数据类型

  • 内置类型 – int,float ……
  • 自定义类型 – 结构体,枚举,共用体。

计算字符类型所占字节数sizeof()是操作符/运算符,不是函数。

C 语言标准规定:

  • sizeof(long) >= sizeof(int)
    • Win X86和X64都为 4。
    • Linux X86为4,X64为8。

计算机中的单位:

  • bit
  • 1 byte = 8bit;
  • 1 kb = 210 byte;
  • mb = 210 kb;
  • gb = 210 mb;
  • tb = 210 gb;
  • pb = 210 tb;
数据类型类型名所占字节数(单位:byte)
char字符型1
short [int]短整型2
int整型4
long [int]长整型4/8
long long [int](C99中提出)更长的整型8
float单精度浮点数4
double双精度浮点数8
字符格式意义
%c字符型格式符
%s字符串型格式符
%d整型 (十进制数据)
%u打印无符号整型
%x打印16进制数字
%f浮点型 - - 小数
%lf双精度浮点数
%p以地址的形式打印
#include <stdio.h>
int main()
{char arr[5] = {0};scanf("%s", arr);return 0;
}

注:

输入的字符个数应比 数组长度小1 。因为,输入格式为字符串,编译器会在字符串末尾自动加'\0'。若输入的字符个数与数组长度相等,会报数组越界的错误。

5. 常量、变量

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

  • 字面常量
  • const修饰的常变量
  • #define定义的标识符常量
  • 枚举常量
#include <stdio.h>// 3. #define 定义的标识符常量
#define MAX 10   // define 属于预处理指令,不属于关键字// 4. 枚举常量   --- 有值且不可被改变
// 枚举 : 一一列举
// 性别 : 男、女、保密
// 三原色:红、黄、蓝enum Sex
{MALE,FEMALE,SECRET
};
// MALE,FEMALE.SECRET -- 枚举常量
int main()
{// 1. 字面常量// 3;// 3.14;// 2. const - 常属性 -- 不能被修改的属性。// const 修饰的常变量const int num = 4;printf("%d\n", num); // 4// num = 8;  // 报错printf("%d\n", num); const int n = 10; // n是变量,但是又有常属性,所以我们说n是常变量// int arr[n] = { 0 }; // 报错 -- 在C99标准之前,数组的大小只能是常量,VS2019对C99支持的不是很好,不支持变长数组,所以这里报错了。// MAX = 200; // error -- 不能修改int arr[MAX] = { 0 };printf("%d\n", MAX); // 10enum Sex s = FEMALE; // 定义枚举类型变量s = MALE; // 枚举类型定义出来的变量可以改变;// MALE = 6; // 枚举常量不可被改变。printf("%d\n", MALE);// 0printf("%d\n", FEMALE);// 1printf("%d\n", SECRET);// 2return 0;
}

变量

指定数据类型为 单精度小数部分不为0时,要加上后缀f,否则会有警告。float weight = 94.3f;(直接写出来的浮点数默认是double类型)。

6. 局部变量、全局变量

  1. 局部变量的作用域是变量的局部范围 – 不初始化 – 默认为随机值(直接用printf函数输出未初始化的变量值,会报错);

  2. 全局变量的作用域是整个工程 – 不初始化,默认是 0 。

  3. 变量前加static,不初始化,默认值也是0;

    #include <stdio.h>
    int i;
    int main()
    {int j;printf("%d\n", i); // 0// printf("%d\n", j); // 报错return 0;
    }
    

在一个项目的不同源文件中的代码,可以相互使用,但是得加extern

// num.c 中代码
#include <stdio.h>int g_val = 111;
// test.c中代码
#include <stdio.h>int main() 
{extern int g_val;// extern g_val; // 两种写法都可以printf("%d", g_val);  // 111 return 0;   // 返回 0
}

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

C语言 没有字符串类型。

7.1 字符串

"hello bit.\n"

双引号(Double Quo)引起来的一串字符称为 字符串字面值 (String Literal),或者简称 字符串

注:

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

#include <stdio.h>
#include <string.h>
int main()
{// 数据在计算机上存储的时候,存储的是2进制// ASCII 编码    ASCII 码值//    A             65//    a             97//    \0            0char arr1[] = "abc"; // "abc" --- 'a' 'b' 'c' '\0' --> 字符串末尾隐藏一个'\0' ---> '\0'字符串结束标志char arr2[] = { 'a','b','c'};char arr3[] = { 'a','b','c','\0'}; // '\0'的值为0,所以这里最后一个字符写'\0'或0都可以printf("%s\n", arr1); // abcprintf("%s\n", arr2); // abc烫烫烫烫蘟bc// 打印完 'a' 'b' 'c' 之后不会结束,会接着打印随机值。printf("%s\n", arr3); // abc// strlen -- strlen length -- 计算字符串长度(不将'\0'算在内)printf("%d\n",strlen(arr1)); // 3printf("%d\n",strlen(arr2)); // 随机值 (a b c x x x x x)printf("%d\n",strlen(arr3)); // 3printf("%s\n", "abc0def"); // abc0def  -- 字符串中的0是字符零('0'),不会被认为是字符串结束标志。printf("%s\n", "abc\0def"); // abcreturn 0;
}

image-20210911163830047

7.2 转义字符

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

举例1:

#include <stdio.h>
int main()
{printf("c:\test\32\test.c"); // c:      est    est.cprintf("c:\\test\\32\\test.c"); // c:\test\32\test.creturn 0;
}

举例2:

?? + ) --> 三字母词

image-20210911163906146

int main()
{printf("(are you ok\??)\n"); // 输出 (are you ok??)return 0;
}

举例3:

#include <stdio.h>
#include <string.h>
int main()
{printf("%s\n", "dsf\091"); // dsfprintf("%d\n",strlen("c:\test\32\test.c")); // 13printf("%d\n",strlen("c:\test\328\test.c")); // 14 // \328 会被看作2个字符 \32 和 8;return 0;
}

7.3 注释

  1. C语言注释风格/* */ – 不支持嵌套的(不太好)。
  2. C++注释风格//
  3. 快捷键
    • ctrl + k + cctrl + shift + /: 进行注释;
    • ctrl + k + u: 取消注释;

8. 常见关键字

  • 关键字不能自己创建。
  • 变量名不能是关键字。
auto(自动)  break   case  char  const   continue  default  do   double else  enum   
extern(声明/引入外部符号) float  for   goto  if   int   long  register(寄存器关键字)    return   short  signed(有符号数)
sizeof   static struct  switch  typedef(类型定义(或类型重命名)) union(联合体 / 共用体)  unsigned   void  volatile(Linux系统部分)  while
int main()
{auto int a = 10; // 局部变量 -- 自动变量(auto 基本不写,省略)register int b = 10; // 建议 将b定义成寄存器变量// int 定义的变量是有符号的// signed int c;  (signed 一般省略不写)return 0;
}

计算机存储数据: 速度: 寄存器 > 高速缓存 > 内存 > 硬盘

8.1 关键字 typedef

typedef类型定义,可以理解为类型重命名。

#include <stdio.h>int main()
{// num1 和 num2 这两个变量的类型是一样的。typedef unsigned int u_int;u_int num1 = 0;unsigned int num2 = 20;return 0;
}

8.2 关键字 static

在C语言中:

static 是用来修饰变量和函数的

  1. 修饰局部变量 – 静态局部变量
  2. 修饰全局变量 – 静态全局变量
  3. 修饰函数 – 静态函数

1. 修饰局部变量:

//代码1
#include <stdio.h>
void test()
{int a = 0;a++;printf("%d ", a);
}
int main()
{int i = 0;for (i = 0; i < 5; i++){test();}return 0;
}// 运行结果 >:  1 1 1 1 1//代码2
#include <stdio.h>
void test()
{//static修饰局部变量static int a = 0;a++;printf("%d ", a);
}
int main()
{int i = 0;for (i = 0; i < 5; i++){test();}return 0;
}// 运行结果 >: 1 2 3 4 5

结论

static修饰局部变量改变了变量的生命周期,让静态局部变量出了作用域仍然存在,到程序结束,生命周期才结束。

2. 修饰全局变量

//代码1
//add.c
int g_val = 2018;//test.c
// 声明外部变量
extern g_val;
int main()
{printf("%d\n", g_val);return 0; 
}
// 可以正常运行//代码2
//add.c
static int g_val = 2018;//test.c
// 声明外部变量
extern g_val;
int main()
{printf("%d\n", g_val);return 0; 
}
// 编译时会报连接性错误

结论:

全局变量本身是具有外部链接属性的,但是一个全局变量被static修饰,使得这个全局变量失去外部链接属性,只能在本源文件内使用,不能在其他源文件内使用。

3. 修饰函数

//代码1
//add.c
int Add(int x, int y) 
{return x+y; 
}//test.c
// 声明外部符号
// extern 最好加上
extern int Add(int x,int y);
int main()
{printf("%d\n", Add(2, 3));return 0; 
}
// 可以正常运行//代码2
//add.c
static int Add(int x, int y) 
{return x+y; 
}
//test.c
// 声明外部符号
int Add(int x,int y);
int main()
{printf("%d\n", Add(2, 3));return 0; 
}
// 编译时会报连接性错误

结论:

函数默认具有外部链接属性,但是一个函数被static修饰,使得函数失去外部链接属性,变成内部链接属性,这个函数只能在本源文件内使用,不能在其他源文件内使用。

static修饰函数改变了函数的链接属性。

由外部链接属性 变为 内部连接属性。

9. #define 定义常量和宏

#include <stdio.h>
// #define #include -- 预处理指令
#define MAX 100
// #define 定义宏
// 函数的实现
int Max(int x, int y)
{if (x > y)return x;elsereturn y;
}// 宏的定义
#define MAX(X, Y) (X>Y?X:Y)
#define ADD(x, y) (x+y)
int main()
{int a = 10;int b = 20;// 函数int max = Max(a, b);printf("max = %d\n", max);// 宏的定义max = MAX(a, b);// max = ((a)+(b));printf("max = %d\n", max);return 0;
}

10. #define 和 typedef 的区别


image-20210912123335384

  • #define是预处理指令,在编译时不进行任何检查,只进行简单的替换。

  • typedef是C语言中用来为复杂的声明定义简单的别名,它本身是一种存储类的关键字,与auto、extern、mutable、static、register等关键字不能出现在同一个表达式中。

  • 区别

    • #define 之后不带分号,typedef之后带分号。

    • #define 可以使用其他类型说明符对宏类型名进行扩展,而typedef 不能这样做。如:

      #define INT1 intunsigned INT1 n;  //没问题typedef int INT2;unsigned INT2 n;  //有问题// INT1可以使用类型说明符unsigned进行扩展,而INT2不能使用unsigned进行扩展。
      
    • 在连续定义几个变量的时候,typedef 能够保证定义的所有变量均为同一类型,而#define则无法保证。如:

      #define PINT1 int*;P_INT1 p1,p2;  //即int *p1,p2;typedet int* PINT2;P_INT2 p1,p2;  //p1、p2 类型相同
      // PINT1定义的p1与p2类型不同,即p1为指向整形的指针变量,p2为整形变量;PINT2定义的p1与p2类型相同,即都是指向 int 类型的指针。
      

希望可以对大家有所帮助,如果有什么不对的地方,还烦请指教,谢谢!


http://chatgpt.dhexx.cn/article/d8Q1rWZp.shtml

相关文章

【笔记】第1章 绪论

A. 计算 一、计算 计算 对象&#xff1a;规律&#xff0c;技巧 目标&#xff1a;高效&#xff0c;低耗computer science – computing science例子 绳索计算机&#xff1a;勾股定理找垂线 尺规计算机&#xff1a;等分点—子程序 二、算法 1. 算法 计算 信息处理 借助…

第1章 NumPy基础

为何第1章介绍NumPy基础&#xff1f;在机器学习和深度学习中&#xff0c;图像、声音、文本等首先要数字化&#xff0c;如何实现数字化&#xff1f;数字化后如何处理&#xff1f;这些都涉及NumPy。NumPy是数据科学的通用语言&#xff0c;它是科学计算、矩阵运算、深度学习的基石…

第1章——初识MySQL

初识MySQL 文章目录 初识MySQL1.MySQL的概述1.1 MySQL的概念1.2 MySQL的特点1.3 相关知识 2.MySQL的初步使用&#xff08;基于黑窗口&#xff09;2.1 配置Path环境变量2.2 登录MySQL服务器&#xff08;1&#xff09;MySQL客户端方式&#xff08;2&#xff09;DOS命令方式 2.3 常…

复习javascript第1章

JavaScript 是全球最流行的编程语言。 JavaScript 是属于 Web 的编程语言。 JavaScript 很容易学习。 JavaScript 能够改变 HTML 内容 getElementById() 是多个 JavaScript HTML 方法之一。 本例使用该方法来“查找” id"demo" 的 HTML 元素&#xff0c;并把元素…

【NLP】第1章 什么是Transformers?

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

第1章 Python 顺序结构

文章目录 Educoder—第1章 Python 顺序结构第1关&#xff1a;Python顺序结构之无输入求多边形的面积第2关&#xff1a;Python顺序结构之无输入求平抛小球与抛出点之间的距离第3关&#xff1a;Python顺序结构之无输入求星期几第4关&#xff1a;Python顺序结构之有输入格式化输出…

【Word/word2007】将标题第1章改成第一章

问题&#xff1a;设置多级列表没有其他格式选的解决办法和带来的插入图注解的问题&#xff0c;将标题第1章改成第一章的问题其他方案。 按照百度搜索的方法设置第一章&#xff0c;可以是没有相应的样式可以选。 那就换到编号选项 设置新的编号值 先选是 然就是变得很丑 这时打开…

python教程第1章

python教程第1章 (1)python(2)IDEIDE是什么安装IDEVSCode第一步第二步第四步插件 海龟编辑器第一步第二步 (3)安装python下载安装包安装 (1)python 为什么python是一个成功的语言呢&#xff1f;正是因为它有非常强大的IDE。 (2)IDE IDE是什么 IDE是三个英文单词的缩写&…

第1章 介绍

介绍 正如业界众所周知的那样&#xff0c;28纳米及以下节点的设计复杂性正在爆炸式增长。小尺寸要求和高性能&#xff0c;低功耗和小面积的相互矛盾的要求导致了如此复杂的设计架构。多核&#xff0c;多线程和功耗&#xff0c;性能和面积&#xff08;PPA&#xff09;需求加剧了…

第1章 Python基础

目录 0. Jupyter Notebook简介 0.1 Jupyter Notebook简介及启动 0.1.1 Jupyter Notebook简介0.1.2 Jupyter Notebook安装与启动0.2 Jupyter Notebook里面的最常用的操作&#xff1a; 0.2.1 更改文件名0.2.2 模式切换0.2.3 命令模式快捷键0.2.4 查询帮助1. Python基础语法 1.1 编…

第1章 实践基础

文章目录 第1章 实践基础1.1 如何运行本书的代码1.1.1 本地运行1.1.1.1 环境准备1.1.1.2 快速安装 1.1.2 AI Studio运行 1.2 张量1.2.1 创建张量1.2.1.1 指定数据创建张量1.2.1.2 指定形状创建1.2.1.3 指定区间创建 1.2.2 张量的属性1.2.2.1 张量的形状1.2.2.2 形状的改变1.2.2…

第1章 Nginx简介

基于 Nginx版本 1.14.2 &#xff0c;Tomcat版本 9.0.0 演示 第1章 Nginx简介 1.1 Nginx发展介绍 Nginx &#xff08;engine x&#xff09; 是一个高性能的Web服务器和反向代理服务器&#xff0c;也可以作为邮件代理服务器。 Nginx 特点是占有内存少&#xff0c;并发处理能力…

第1章 多线程基础

第1章 多线程基础 1.1.2 线程与进程的关系 进程可以看成是线程的容器&#xff0c;而线程又可以看成是进程中的执行路径。 1.2 多线程启动 线程有两种启动方式&#xff1a;实现Runnable接口&#xff1b;继承Thread类并重写run()方法。 执行进程中的任务时才会产生线程&a…

第1章 Rust安装

Rust是一门安全的语言&#xff0c;最近也加入到Linux内核中&#xff0c;因此后续这门语言会越来越流行&#xff0c;所以准备学习下&#xff0c;本篇介绍Rust在Window平台上的安装过程。 目录 安装步骤 1.到官网下载安装包 2.搭建 Visual Studio Code 开发环境 安装步骤 1.…

第1章 概述

第一章 概述 考试范围&#xff1a; 1.1-1.10 考试内容&#xff1a; 章节后的Review Terms&#xff08;名词基本都在课文中&#xff09; 考试题型&#xff1a; 综合题 Review Terms Database-management system (DBMS) &#xff1a;A collection of interrelated data and a …

图书馆预约占座管理系统项目源码+文档+jsp+ssm+mysql

【项目功能描述】 【源码下载】 图书馆预约占座管理系统的开发技术为jspssmmysql&#xff0c;前端技术为jquery easyui框架&#xff0c;后台用的ssm&#xff08;spring、springMVC、mybaits&#xff09;框架&#xff0c;主要实现的功能有&#xff1a;用户管理、菜单管理、角色…

图书馆座位预约小程序系统设计与实现

项目背景和意义 目的&#xff1a;本课题主要目标是设计并能够实现一个基于微信小程序预约订座小程序&#xff0c;前台用户使用小程序&#xff0c;后台管理使用JavaMysql开发&#xff0c;后台使用了springboot框架&#xff1b;通过后台添加座位类型、座位号&#xff0c;用户通过…

【计算机毕业设计】基于微信小程序的图书馆座位预约系统

毕设帮助、源码交流及技术指导&#xff0c;见文末。 图书馆作为高校的学习宝地&#xff0c;有着不可替代的地位。但是在信息化时代&#xff0c;传统模式下的图书馆管理并不能满足用户需求。为解决图书馆学生占座问题严重、座位资源紧张的问题,设计了图书馆座位预约系统&#xf…

学校图书馆管理系统

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;学校图书馆管理系统当然也不能排除在外。学校图书馆管理系统是以实际运用为开发背景&#xff0c;运用软件工程开发方法&…

基于javaweb+SpringBoot+JPA图书馆座位占座预约管理系统(管理员、老师、学生)

基于javawebSpringBootJPA图书馆座位占座预约管理系统(管理员、老师、学生) 开发工具&#xff1a;eclipse/idea/myeclipse/sts等均可配置运行 适用 课程设计&#xff0c;大作业&#xff0c;毕业设计&#xff0c;项目练习&#xff0c;学习演示等 /*** 修改密码页面** return*…