C语言

环境搭建

为了在 Windows 上安装 GCC,您需要安装 MinGW。为了安装 MinGW,请访问 MinGW 的主页 mingw-w64.org,进入 MinGW 下载页面,下载最新版本的 MinGW 安装程序,命名格式为 MinGW-.exe。
当安装 MinGW 时,您至少要安装 gcc-core、gcc-g++、binutils 和 MinGW runtime,但是一般情况下都会安装更多其他的项。
添加您安装的 MinGW 的 bin 子目录到您的 PATH 环境变量中,这样您就可以在命令行中通过简单的名称来指定这些工具。
当完成安装时,您可以从 Windows 命令行上运行 gcc、g++、ar、ranlib、dlltool 和其他一些 GNU 工具。

工具下载

这个工具我就直接分享给大家了!
阿里云
将这个下载到本地,然后我们进行解压,将解压好的文件存放到一个可以记住的目录下。
image

配置环境变量

image
image
这里就是我的环境变量设置,大家不一定非要和我的一样。

测试一下是否成功了

gcc -v

image
看到和我这个类似的就说明配置成功了下面我们就可以编程了。

Hello Word

c语言程序结构

  • 预处理指令
  • 函数
  • 变量
  • 语句&表达式
  • 注释

好开始我们的hello word编写

  1. 新建文件helloword.c文件,并键入一下内容
    #include <stdio.h>
    int main(){
    	printf("Hello Word \n");
    	return 0;
    }
    
  2. 保存文件
  3. 编译
    打开我们的dos命令行切换路径到当前文件的路径下使用gcc进行编译并运行!
    image

C语言基础

基本语法

  • C语言的结束符是;分号,也就是说每个语句必须要以分号结束
  • 注释
    // 单行注释
    /**/ 单行注释
    /*
    多行注释
    */
    
    
  • 标识符
    C 标识符是用来标识变量、函数,或任何其他用户自定义项目的名称。一个标识符以字母 A-Z 或 a-z 或下划线 _ 开始,后跟零个或多个字母、下划线和数字(0-9)。C 标识符内不允许出现标点字符,比如 @、$ 和 %。C 是区分大小写的编程语言。因此,在 C 中,Manpower 和 manpower 是两个不同的标识符
  • 关键字
    image
    image
    image

数据类型

在 C 语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式。

  1. 基本类型
    它们是算术类型,包括两种类型:整数类型和浮点类型。
  2. 枚举类型
    它们也是算术类型,被用来定义在程序中只能赋予其一定的离散整数值的变量。
  3. void 类型
    类型说明符 void 表明没有可用的值。
  4. 派生类型
    它们包括:指针类型、数组类型、结构类型、共用体类型和函数类型。
    数组类型和结构类型统称为聚合类型。函数的类型指的是函数返回值的类型。在本章节接下来的部分我们将介绍基本类型,其他几种类型会在后边几个章节中进行讲解。

整数类型

image
为了得到某个类型或某个变量在特定平台上的准确大小,您可以使用 sizeof 运算符。表达式 sizeof(type) 得到对象或类型的存储字节大小
printf函数个格式化输出

  • %d 十进制有符号整数
  • %u 十进制无符号整数
  • %f 浮点数
  • %s 字符串
  • %c 单个字符
  • %p 指针的值
  • %e 指数形式的浮点数
  • %x, %X 无符号以十六进制表示的整数
  • %o 无符号以八进制表示的整数
  • %g 把输出的值按照 %e 或者 %f 类型中输出长度较小的方式输出
  • %p 输出地址符
  • %lu 32位无符号整数
  • %llu 64位无符号整数
#include<stdio.h>
#include<limits.h>
int main(){
    printf("int 存储大小是 : %lu \n",sizeof(int));
}

浮点类型

image
头文件 float.h 定义了宏,在程序中可以使用这些值和其他有关实数二进制表示的细节

#include<stdio.h>
#include<float.h>
int main(){
    printf("float 存储最大字节数 : %lu \n",sizeof(float));
    printf("float 最小值 : %E \n",FLT_MIN);
     printf("float 最大值 : %E \n",FLT_MAX);
     printf("float 精度值 : %d \n",FLT_DIG);
}

void 类型

void 类型指定没有可用的值。它通常用于以下三种情况下:
image

变量

变量其实只不过是程序可操作的存储区的名称。C 中每个变量都有特定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上。变量的名称可以由字母、数字和下划线字符组成。它必须以字母或下划线开头。大写字母和小写字母是不同的,因为 C 是大小写敏感的。C 语言也允许定义各种其他类型的变量,比如枚举、指针、数组、结构、共用体等等,

type variable_list;

在这里,type 必须是一个有效的 C 数据类型,可以是 char、w_char、int、float、double 或任何用户自定义的对象,variable_list 可以由一个或多个标识符名称组成,多个标识符之间用逗号分隔。
变量的声明有两种情况:
1、一种是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。
2、另一种是不需要建立存储空间的,通过使用extern关键字声明变量名而不定义它。 例如:extern int a 其中变量 a 可以在别的文件中定义的。

  • 除非有extern关键字,否则都是变量的定义。
#include<stdio.h>
// 函数外部定义变量x 和y
int x;
int y;
int addtwonum(){
    // 函数内部声明变量 x 和 y 为外部变量
    extern int x;
    extern int y;
    // 给外部变量(全局变量)x和 y 赋值
    x=1;
    y=2;
    return x+y;
}
int main(){
    int result;
    // 调用函数
    result = addtwonum();
    printf("result %d",result);
    return 0;
}

image
如果需要在一个源文件中引用另外一个源文件中定义的变量,我们只需在引用的文件中将变量加上 extern 关键字的声明即可。
variable_01.c

#include<stdio.h>
/* 外部变量生命 */
extern int x;
extern int y;
int addtwonum(){
    return x+y;
}

variable_02.c

#include<stdio.h>
/* 定义两个全局变量 */
int x=1;
int y=2;

int addtwonum();
int main(void){
    int result;
    result = addtwonum();
    printf("result   %d\n",result);
    return 0;
}
gcc variable_01.c variable_02.c -o main

image

C 中的左值(Lvalues)和右值(Rvalues)

  • 左值: 指向内存位置的表达式被称为左值(lvalue)表达式。左值可以出现在赋值号的左边或右边。
  • 右值: 术语右值(rvalue)指的是存储在内存中某些地址的数值。右值是不能对其进行赋值的表达式,也就是说,右值可以出现在赋值号的右边,但不能出现在赋值号的左边。

常量

常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面量。
常量可以是任何的基本数据类型,比如整数常量、浮点常量、字符常量,或字符串字面值,也有枚举常量。
常量就像是常规的变量,只不过常量的值在定义后不能进行修改。

整数常量

整数常量可以是十进制、八进制或十六进制的常量。前缀指定基数:0x 或 0X 表示十六进制,0 表示八进制,不带前缀则默认表示十进制。
整数常量也可以带一个后缀,后缀是 U 和 L 的组合,U 表示无符号整数(unsigned),L 表示长整数(long)。后缀可以是大写,也可以是小写,U 和 L 的顺序任意。

浮点常量

浮点常量由整数部分、小数点、小数部分和指数部分组成。您可以使用小数形式或者指数形式来表示浮点常量。
当使用小数形式表示时,必须包含整数部分、小数部分,或同时包含两者。当使用指数形式表示时, 必须包含小数点、指数,或同时包含两者。带符号的指数是用 e 或 E 引入的

字符常量

字符常量是括在单引号中,例如,'x' 可以存储在 char 类型的简单变量中。
字符常量可以是一个普通的字符(例如 'x')、一个转义序列(例如 '\t'),或一个通用的字符(例如 '\u02C0')。
在 C 中,有一些特定的字符,当它们前面有反斜杠时,它们就具有特殊的含义,被用来表示如换行符(\n)或制表符(\t)等。下表列出了一些这

字符串常量

字符串字面值或常量是括在双引号 "" 中的。一个字符串包含类似于字符常量的字符:普通的字符、转义序列和通用的字符。
您可以使用空格做分隔符,把一个很长的字符串常量进行分行。

定义常量

在 C 中,有两种简单的定义常量的方式:

  • 使用#define预处理器
  • 使用const关键字
#include<stdio.h>
#define LENGTH 10
#define WIDTH 5
int main(){
    int are;
    are = LENGTH * WIDTH;
    printf("are of area: %d",are);
}

image

存储类

存储类定义 C 程序中变量/函数的范围(可见性)和生命周期。这些说明符放置在它们所修饰的类型之前。下面列出 C 程序中可用的存储类:

  • auto
  • register
  • static
  • extern
    auto存储类
    auto 存储类是所有局部变量默认的存储类
{
int mount;
auto int month;
}

上面的实例定义了两个带有相同存储类的变量,auto 只能用在函数内,即 auto 只能修饰局部变量。
register 存储类
register 存储类用于定义存储在寄存器中而不是 RAM 中的局部变量。这意味着变量的最大尺寸等于寄存器的大小(通常是一个字),且不能对它应用一元的 '&' 运算符(因为它没有内存位置)。

{
   register int  miles;
}

寄存器只用于需要快速访问的变量,比如计数器。还应注意的是,定义 'register' 并不意味着变量将被存储在寄存器中,它意味着变量可能存储在寄存器中,这取决于硬件和实现的限制。
static 存储类
static 存储类指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。因此,使用 static 修饰局部变量可以在函数调用之间保持局部变量的值。
static 修饰符也可以应用于全局变量。当 static 修饰全局变量时,会使变量的作用域限制在声明它的文件内。
全局声明的一个 static 变量或方法可以被任何函数或方法调用,只要这些方法出现在跟 static 变量或方法同一个文件中。

#include<stdio.h>
void func1(void);
static int count = 10;
int main(){
    while (count--)
    {
        func1();
    }
    return 0 ;
}
 void func1(void){
    static int thingy = 5;
    thingy++;
    printf("thingy  为   %d,   conut   为    %d  \n",thingy,count );
 }

image
extern 存储类
extern 存储类用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。当您使用 extern 时,对于无法初始化的变量,会把变量名指向一个之前定义过的存储位置。
当您有多个文件且定义了一个可以在其他文件中使用的全局变量或函数时,可以在其他文件中使用 extern 来得到已定义的变量或函数的引用。可以这么理解,extern 是用来在另一个文件中声明一个全局变量或函数。
extern 修饰符通常用于当有两个或多个文件共享相同的全局变量或函数的时候

#include<stdio.h>
int count;
extern void write_cjh();
int main(){
    count = 5;
    write_cjh();
}
#include<stdio.h>
extern int count;
void write_cjh(){
    printf(" count   is   %d   \n",count);
}

image

运算符

image

循环

如果条件永远不为假,则循环将变成无限循环。for 循环在传统意义上可用于实现无限循环。由于构成循环的三个表达式中任何一个都不是必需的,您可以将某些条件表达式留空来构成一个无限循环。

#include<stdio.h>
int main(){
    for( ; ; ){
        printf(" loop  ");
        
    }
    return 0 ;
}

goto

C 语言中的 goto 语句允许把控制无条件转移到同一函数内的被标记的语句。
注意:在任何编程语言中,都不建议使用 goto 语句。因为它使得程序的控制流难以跟踪,使程序难以理解和难以修改。任何使用 goto 语句的程序可以改写成不需要使用 goto 语句的写法。

函数

函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。
您可以把代码划分到不同的函数中。如何划分代码到不同的函数中是由您来决定的,但在逻辑上,划分通常是根据每个函数执行一个特定的任务来进行的。函数声明告诉编译器函数的名称、返回类型和参数。函数定义提供了函数的实际主体。
C 标准库提供了大量的程序可以调用的内置函数。例如,函数 strcat() 用来连接两个字符串,函数 memcpy() 用来复制内存到另一个位置。
在 C 语言中,函数由一个函数头和一个函数主体组成。下面列出一个函数的所有组成部分

  • 返回类型 一个函数可以返回一个值。return_type 是函数返回的值的数据类型。有些函数执行所需的操作而不返回值,在这种情况下,return_type 是关键字 void。
  • 函数名称 这是函数的实际名称。函数名和参数列表一起构成了函数签名
  • 参数 参数就像是占位符。当函数被调用时,您向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数
  • 函数主体 函数主体包含一组定义函数执行任务的语句
int max(int num1, int num2) 
{
   /* 局部变量声明 */
   int result;
   if (num1 > num2)
      result = num1;
   else
      result = num2;
   return result; 
}

函数的调用

创建 C 函数时,会定义函数做什么,然后通过调用函数来完成已定义的任务。
当程序调用函数时,程序控制权会转移给被调用的函数。被调用的函数执行已定义的任务,当函数的返回语句被执行时,或到达函数的结束括号时,会把程序控制权交还给主程序。
调用函数时,传递所需参数,如果函数返回一个值,则可以存储返回值。例如:

#include <stdio.h>
/* 函数声明 */
int max(int num1, int num2);
int main ()
{
   /* 局部变量定义 */
   int a = 100;
   int b = 200;
   int ret;
   /* 调用函数来获取最大值 */
   ret = max(a, b);
   printf( "Max value is : %d\n", ret );
   return 0;
}
/* 函数返回两个数中较大的那个数 */
int max(int num1, int num2) 
{
   /* 局部变量声明 */
   int result;
   if (num1 > num2)
      result = num1;
   else
      result = num2;
   return result; 
}

函数参数

如果函数要使用参数,则必须声明接受参数值的变量。这些变量称为函数的形式参数。
形式参数就像函数内的其他局部变量,在进入函数时被创建,退出函数时被销毁。
当调用函数时,有两种向函数传递参数的方式:
image
默认情况下,C 使用传值调用来传递参数。一般来说,这意味着函数内的代码不能改变用于调用函数的实际参数。

c作用域规则

posted @ 2022-08-18 12:04  niandb  阅读(215)  评论(0)    收藏  举报