【C语言】关于我回头学的那些基础语法(一)

这篇具有很好参考价值的文章主要介绍了【C语言】关于我回头学的那些基础语法(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

我的第一门语言就是C,但是学艺不精,中途跑去学了C#和Java后,感觉到了C的重要性,毕竟是最接近底层的语言,又跑回来学C。

毕竟前两门的控制语句,变量什么的都是类似的,回到C后只需要学习一些特定C的语法,比如宏,预编译指令等等,这些对我来说都是陌生的词汇。

所以边学边记录一下陌生的知识。



一、两个.c文件如何相互调用

在C语言中,不同的.c文件可以通过头文件(.h文件)来进行相互访问。头文件中定义了不同.c文件间需要共享的函数声明、宏定义、结构体定义等内容。

通常,一个.c文件的内容包括函数定义全局变量定义对于需要在其他文件中使用的函数和变量,我们需要将其声明在对应的头文件中,并在其他.c文件中引用这个头文件。

举个例子,假设我们有两个.c文件 aa.c 和 bb.c 。如果 aa.c 中定义了一个函数 foo() ,并且 bb.c 需要调用这个函数,那么我们需要做以下几个步骤:

  1. 在 aa.h 头文件中声明 foo() 函数,例如: void foo();
  2. 在 bb.c 中引用 aa.h 头文件:#include "aa.h"
  3. 在 bb.c 中调用 foo() 函数即可: foo();

需要注意的是,在编译时需要同时将 aa.c 和 bb.c 文件编译链接起来才能正常运行程序。一般情况下,我们会将所有的 .c 文件打包成静态库或动态库,在编译时链接相应的库即可。

注意事项:

  • 头文件中只需包含函数声明而不是实际的代码实现。
  • 确保使用正确的头文件名称和路径。
  • 如果需要传递参数,则必须在两个 .c 文件中共享相同的参数类型和名称。
  • 为了避免命名冲突,建议在头文件和变量名前加上前缀或者命名空间等标识符来区分不同模块或库中相同名称的变量和函数。

二、格式控制符

在 C 语言中,%d 是格式控制符,用于在 printf() 函数中输出有符号十进制整数。

比如:

int num = 100;
printf("The number is: %d", num);

上述代码中,%d 用于表示整数类型的变量 num 要输出为十进制格式。这里的字符串 "The number is: " 是格式字符串,将会被输出。

在 scanf() 函数中,%d 也被用来读取用户输入的整数,例如:

int num;
scanf("%d", &num);

在这个例子中,%d 表示要读取用户输入的一个整数,并将其存储到变量 num 中。

除了 %d,还有其他一些常用的格式控制符,比如:

  • %d:用于打印整型
  • %f :用于打印浮点数
  • %c: 用于打印字符
  • %s :用于打印字符串
  • %p: 用于打印指针地址
  • %% :用于打印百分号本身

三、常量

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

  • 使用#define预处理器。
  • 使用const关键字。

#define LENGTH 10
const int LENGTH = 10;

一般把常量定义为大写字母形式。
【C语言】关于我回头学的那些基础语法(一)
【C语言】关于我回头学的那些基础语法(一)


四、枚举

枚举变量的定义,最后要记得加冒号。

前面我们只是声明了枚举类型,接下来我们看看如何定义枚举变量。

我们可以通过以下三种方式来定义枚举变量

1、先定义枚举类型,再定义枚举变量

enum DAY
{
      MON=1, TUE, WED, THU, FRI, SAT, SUN
};
enum DAY day;

2、定义枚举类型的同时定义枚举变量

enum DAY
{
      MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;

3、省略枚举名称,直接定义枚举变量

enum
{
      MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;


五、控制语句

C语言中也有这样的语句,就是goto语句,goto语句是一种无条件分支语句,直接执行。

goto 语句的使用格式为:

goto 语句标号;

【C语言】关于我回头学的那些基础语法(一)


六、数组

1)声明数组

balance 是一个可用的数组,可以容纳 10 个类型为 double 的数字。

double balance[10];

其他的定义方式:

//代码1
int arr1[10];
char arr2[10];
float arr3[1];
double arr4[20];

//代码2,用宏定义
#define X 3
int arr5[X];

2)初始化数组

double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};

如果您省略掉了数组的大小,数组的大小则为初始化时元素的个数。

double balance[] = {1000.0, 2.0, 3.4, 7.0, 50.0};


七、函数

1)自定义函数

返回值类型 函数名 (参数列表) { 函数体 }

1.自定义函数写法1(推荐)

#include <stdio.h>
int plus(int x,int y);  //此处有分号,表示函数的声明
int main()
{
	int a,b,c;
	a=1;
	b=2;
	c=plus(a,b);        //函数的调用
	printf("%d",c);
	return 0;
}
int plus(int x,int y)   //此处无分号,表示函数的定义
{
	int result;
	result=x+y;
	return result;
}

2.自定义函数写法2

#include <stdio.h>
int plus(int x,int y);  //此处无分号
{
	int result;
	result=x+y;
	return result;
}
int main()
{
	int a,b,c;
	a=1;
	b=2;
	c=plus(a,b);        //函数的调用
	printf("%d",c);
	return 0;
}

3.外部函数

在C语言中,外部函数指的是定义在当前编译单元外部的函数。这些函数通常声明在头文件中,并在一个或多个源文件中进行定义。

外部函数可以是库函数或用户自定义函数。库函数通常由操作系统或第三方库提供,可以被程序员直接调用使用。用户自定义函数则是由程序员自己编写并在程序中使用的函数。

当我们需要使用一个外部函数时,必须在代码中包含该函数所在的头文件,并进行相应的链接,以便让连接器找到并正确处理该外部函数。

以下为定义和使用外部函数的示例:

  1. 定义头文件
// func.h
#ifndef _FUNC_H_
#define _FUNC_H_

int add(int a, int b);

#endif

#ifndef#define 是C语言预处理器指令,用于条件编译。

#ifndef _FUNC_H_ 表示如果 _FUNC_H_ 宏还没有被定义过(即这是第一次包含该头文件),则执行下面的代码块。如果已经被定义过,则跳过代码块。

#define _FUNC_H_ 则用于定义 _FUNC_H_ 宏,确保它在当前文件中只被定义一次。这个宏可以在其他文件中被引用和检查。

综合起来,这两行指令的作用是:当第一次引入头文件时,定义一个标记宏 _FUNC_H_,以避免重复引入同一个头文件。当再次引入时,由于宏已经被定义,头文件内部的代码块将不会被重复执行。

  1. 定义源文件
// func.c
#include "func.h"

int add(int a, int b) {
    return a + b;
}
  1. 在主程序中使用
// main.c
#include <stdio.h>
#include "func.h"

int main() {
    int result = add(1, 2);
    printf("The result is: %d
", result);
    return 0;
}

通过以上代码,我们在 func.h 文件中声明了一个 add 函数,在 func.c 文件中进行了实现。当我们需要使用 add 函数时,在主程序中引入 func.h 头文件并调用该函数即可。

需要注意的是,在编译时我们需要将 main.cfunc.c 进行链接,以便让编译器找到 add 函数的定义。这可以通过以下命令进行编译:

gcc main.c func.c -o main

以上是关于C语言中外部函数的简要介绍,希望对您有所帮助。

2)API——sizeof()

在c语言中,sizeof是一个操作符,用于计算数据类型或变量的大小(即占用的存储空间)。它可以用于任何数据类型,包括基本数据类型(如int、float、double等)和复合数据类型(如结构体、数组等)。使用sizeof可以帮助程序员确定变量或数据类型在内存中占用的空间大小,从而更好地管理内存和优化程序性能。

举例:
int length = sizeof(arr)/sizeof(arr[0]);

这条语句的作用是计算一个数组arr的长度。其中,sizeof(arr)表示arr数组所占用的内存空间的大小,sizeof(arr[0])表示arr数组中第一个元素所占用的内存空间的大小。因为数组中所有元素的类型和大小都相同,所以arr数组中所有元素所占用的内存空间大小都相同,可以用第一个元素来代表整个数组的大小。最终,通过将arr数组所占用的内存空间大小除以第一个元素所占用的内存空间大小,就可以得到arr数组中元素的个数,即数组的长度。


八、存储类

  • 寄存器的(register)
  • 外部的(extern)

1)静态存储类static

static 存储类指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。因此,使用 static 修饰局部变量可以在函数调用之间保持局部变量的值。

static 修饰符也可以应用于全局变量。当 static 修饰全局变量时,会使变量的作用域限制在声明它的文件内。

全局声明的一个static变量或方法可以被任何函数或方法调用,只要这些方法出现在跟 static 变量或方法同一个文件中。

2)寄存器存储类register

C语言允许将局部自动变量形式参数的值放在CPU中的寄存器中,这种变量叫“寄存器变量”,用关键字register作声明。

在需要频繁访问的变量上使用 register 存储类可以提高程序的运行速度,寄存器只用于需要快速访问的变量,比如计数器。还应注意的是,定义 register并不意味着变量将被存储在寄存器中,它意味着变量可能存储在寄存器中,这取决于硬件和实现的限制。

一个计算机系统中的寄存器数目有限,不能定义任意多个寄存器变量,且局部静态变量不能定义为寄存器变量。

register int a;

3)外部存储类extern

extern声明的的变量是外部变量,只声明而不定义。

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

extern 存储类用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。当您使用 extern 时,对于无法初始化的变量,会把变量名指向一个之前定义过的存储位置。

当您有多个文件且定义了一个可以在其他文件中使用的全局变量或函数时,可以在其他文件中使用 extern 来得到已定义的变量或函数的引用。可以这么理解,extern 是用来在另一个文件中声明一个全局变量或函数。

extern 修饰符通常用于当有两个或多个文件共享相同的全局变量或函数的时候。

1、一种是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。

2、另一种是不需要建立存储空间的,通过使用extern关键字声明变量名而不定义它。 例如:extern int a 其中变量 a 可以在别的文件中定义的。

除非有extern关键字,否则都是变量的定义。

extern int i; //声明,不是定义(表明变量i是在其他文件中定义的
int i; //声明,也是定义文章来源地址https://www.toymoban.com/news/detail-407700.html

到了这里,关于【C语言】关于我回头学的那些基础语法(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C语言基础】那些你可能不知道的C语言“潜规则”

    📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍 收藏 ⭐不迷路🙉 📢:内容若有错误,敬请留言 📝指正!原创文,转载请注明出处 🧩UL的定义: 在

    2024年02月09日
    浏览(35)
  • C语言-基础语法学习-1 函数

    当我们需要在C语言中传递一维数组作为函数的形参时,需要了解以下几个关键点: 函数声明和定义:在声明和定义函数时,我们可以使用以下方式指定一维数组作为形参: 或者 这两种方式都允许我们传递一个一维数组作为形参。 数组传递:在C语言中,数组传递实际上是通

    2024年02月12日
    浏览(44)
  • Go 语言面试题(一):基础语法

    := 声明+赋值 = 仅赋值 指针用来保存变量的地址。 例如 运算符,也称为解引用运算符,用于访问地址中的值。 &运算符,也称为地址运算符,用于返回变量的地址。 允许 Go 没有异常类型,只有错误类型(Error),通常使用返回值来表示异常状态。 Goroutine 是与其他函数或方

    2024年02月14日
    浏览(34)
  • C语言-基础语法学习-3 二级指针

    当涉及到多级指针时,C语言的灵活性和强大的指针功能可以得到充分的发挥。二级指针是指指向指针的指针,也被称为指向指针的引用。 使用二级指针可以实现以下功能: 动态内存分配:通过二级指针可以动态地分配内存块,并将其地址传递给其他函数或模块进行操作。这

    2024年02月12日
    浏览(35)
  • 【C语言】学数据结构前必学的结构体struct详细

    佛祖说,他可以满足程序猿一个愿望。程序猿许愿有生之年写出一个没有bug的程序,然后他得到了永生。 目录 1、结构体的声明与定义 1.1结构体是什么? 1.2为什么要有结构? 1.3结构体的声明 1.4结构体成员类型 1.5结构体变量定义和初始化 2、结构体成员的访问 3、结构体传参

    2024年02月11日
    浏览(48)
  • 走进 Go 语言基础语法 | 青训营 (1)

    Powered by: NEFU AB-IN Go 语言入门指南:基础语法和常用特性解析 go.mod 这个文件里记录了当前项目里所有依赖包的 git 仓库地址以及对应的 版本号 ,来解决了包依赖管理的问题,后续在构建编译时,就会根据对应的版本号去拉取依赖包。 注意, 如果当前的项目是要给外部使用的

    2024年02月14日
    浏览(32)
  • Rust 程序设计语言学习——基础语法

    Rust 语言是一种高效、可靠的通用高级语言。其高效不仅限于开发效率,它的执行效率也是令人称赞的,是一种少有的兼顾开发效率和执行效率的语言。 Rust 语言由 Mozilla 开发,最早发布于 2014 年 9 月。Rust 的编译器是在 MIT License 和 Apache License 2.0 双重协议声明下的免费开源软

    2024年01月22日
    浏览(43)
  • R语言基础的代码语法解译笔记

    1、双冒号,即:“::” 要使用某个包里的函数,通常做法是先加载(library)包,再调用函数。最新加载的包的namespace会成为最新的enviroment,某些情况下可能影响函数的结果。而 package name::functionname 的用法,一是可以在需要用某个函数时临时直接加载包,不用事先library。另

    2024年03月11日
    浏览(55)
  • sql语法:事务的”那些事“

    Mysql版本:8.0.26 可视化客户端:sql yog 随着人工智能与大数据的不断发展,数据库的管理与维护这门技能也越来越重要,很多人都开启了学习sql语言的相关知识,本文简要介绍了数据库sql语言中的事务部分内容。 提示:以下是本篇文章正文内容,下面案例可供参考 👉事务是

    2023年04月15日
    浏览(22)
  • C语言基础语法跟练 day4

    41、牛牛有一个半径为 r 的球,他想知道这个球的体积。 42、小乐乐比较懒惰,他现在想睡觉,然后再去学习。他知道现在的时刻,以及自己要睡的时长,想设定一个闹钟叫他起床学习,但是他太笨了,不知道应该把闹钟设定在哪个时刻,请你帮助他。(只考虑时和分,不考虑

    2024年01月20日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包