初步了解c语言(三)

news2024/11/13 10:03:33

注:此篇文章仅限初步了解,本小白后续会持续进行详解。

目录:

    • 函数
    • 数组
      • 数组的定义
      • 数组的下标
    • 操作符
    • 常见关键字
    • 关键字static的使用
      • 修饰局部变量
      • 修饰全局变量
      • 修饰函数
    • 关键字register的大概了解
    • #define定义常量和宏
    • 结构体
    • 💞结尾

函数

   数学的函数,给定不同的自变量,会有不同的因变量,c语言的函数与其很相似,是一个模块的代码,完成一个独立的功能
  例如: 写一个函数来实现一个加法。

#include<stdio.h>
//加法函数
int ADD(int x, int y)
{
	int z = x + y;
	return z;
}
int main()
{
	int num1 = 0;
	int num2 = 0;
	scanf("%d %d", &num1, &num2);
	//调用函数
	int sum = ADD(num1, num2);
	printf("sum = %d\n", sum);
	return 0;
}

📙一些对函数的大概解释:

函数拥有 简化代码,代码复用 的特点。


数组

📙数组的定义: 一组相同类型元素的集合。

数组的定义

例如: int arr[5]; 表示 数组里面有 5 个元素,每个元素都是int 类型。对于数组,我们可以直接初始化,例如:int arr[5] = {1,2,3,4,5}; 这样,数组里面的5个元素就是 1 ,2 ,3 ,4, 5 。

数组的下标

📙c语言规定:数组的每个元素都有一个从0开始的下标,数组是可以通过下标来访问的。

如何通过下标来访问呢❓
例如:

#include<stdio.h>
int main()
{
	int arr[5] = {1,2,3,4,5};
	printf("%d\n", arr[1]);
	return 0;
}

这里我们打印 arr[1] ,通过下标,我们可以访问到元素 2 ,自然打印结果就是 2 了。


操作符

(此处仅仅 简单解释,没有提到的操作符会在之后写)

算数操作符

+         -         *           /         %

📘    / 计算后的结果是商。并且有两种除法,一个是整数除法,一个是小数除法。

  1. 整数除法 : 假如是 5 / 2 , 两个整数相除,会得到一个整数,即它的商,得到的结果自然就是 2 .
  2. 浮点数除法: 如果想让 5 /2的结果为 2.5 ,就必须执行浮点数除法,需要保证除数和被除数至少有一个是浮点数
    例如 : 5.0 / 2 ; 5 / 2.0 ; 5.0 / 2.0

📘% 被称为取模操作符,也就是算余数。但是需要注意的是,它的操作数只能是整数,不可以是浮点数。 例如:可以 5%2,但是不可以 5% 2.0 。

移位操作符

>>       <<

位操作符

&         ^         |

这两部分的操作符 操作的是 二进制位,之后我会详细说明。
赋值操作符

=        +=        -=        *=        /=        &=        ^=        |=         >>=         <<=

= 即为赋值,例如:将 0 赋值给 a , a = 0; .
+= 这种赋值是复合赋值a = a + 1;a+=1; 意思是一样的。像-= ,*=…这些,其实都是类似的。

单目操作符
只有一个操作数

!   -  +  & sizeof  ~  –  ++  *  (类型)

单目操作符
逻辑反操作
-负值
+正值
&取地址
sizeof操作数的类型长度
~对一个数的二进制取反
- -前置或后置- -
++前置或后置++
*间接访问操作符(解引用操作符)
(类型)强制转换类型

📙一些解释:

  1. c语言中,0为假,非0为真。
    !可以逻辑反操作,将真变为假,将假变为真。例如:!0 —— 为真 ,结果是1,!2 —— 结果是假 ,为0.
  2. sizeof是一个操作符,可以计算变量的大小,例如 sizeof(int) 或者sizeof(a) ,对于这种里面是类型的,相当于计算该类型创建的变量的大小,注意:计算变量的时候,()可以去掉,例如sizeof a,这也正好说明了sizeof是一个操作符,而不是函数(函数的()是不可以省略的),但是括号里面是类型的话是不可以的。
  3. 后置++,是先使用,后++,前置++,是先++,后使用

关系操作符

 >  >=  <  <=  !=  ==

这些是用来判断大小关系的。
其中 >= 为 大于等于 ; <= 为 小于等于; == 用于判断相等 ;!= 用于判断不等。

逻辑操作符

&&  ||

&& 为 逻辑与(并且) ,|| 为逻辑或(或者)。

条件操作符

exp1 ? exp2 :exp3

c语言中唯一的一个三目操作符(有三个操作数)。

例如:比较一个大小
int max = (firstNum > secondNum ? firstNum : secondNum);

逗号表达式

exp1, exp2, exp3, … expN

其实就是用逗号隔开的表达式。
从左向右依次计算,逗号表达式的结果就是最后一个表达式的结果。
例:

下标引用,函数调用和结构成员

[ ]    ()  .  ->

📙一点解释:


常见关键字

c语言中有大量的关键字,这些关键字都是语言本身预先设定好的,而且自己是不能创建关键字的。

📙一些解释:

  1. 局部变量是进入作用域自动创建,出了作用域自动销毁,所以局部变量本身前面是有个auto,不过很普遍,就直接省略了。
  2. void 可以作为函数的返回值 或 函数的参数 或 修饰指针。
  3. typedef 可以理解为类型重命名,例如:
typedef unsigned long ul;
int main()
{
	unsigned long firstNum = 0;
	ul secondNum = 0;
	return 0;
}

相当于将unsigned long 又取了一个名字叫 ul ,上述两种创建变量的类型是一样的


关键字static的使用

c语言中,static是用来修饰函数和变量的。

修饰局部变量

我们先看一个例子:

#include<stdio.h>
void test()
{
	int num = 1;
	num++;
	printf("%d ", num);
}

int main()
{
	int i = 0;

	while (i < 5)
	{
		test();
		i++;
	}

	return 0;
}

❗️结果

❗️监视窗口

我们让static修饰一下 num 看一看结果如何:

#include<stdio.h>
void test()
{
	static int num = 1;
	num++;
	printf("%d ", num);
}

int main()
{
	int i = 0;

	while (i < 5)
	{
		test();
		i++;
	}
	return 0;
}

❗️结果

❗️监视窗口

这个现象是如何产生的呢?
💫对于第一个代码,由于num是局部变量,当num出了作用域,该变量被归还给了操作系统,每一次调用test都会创建一个新的num 并被重新赋予 1.
💫对于第二个代码,我们将用static修饰num后,通过监视可以发现,在num出了作用域后仿佛并没有被销毁,保留了此次的执行结果,在下一次被调用的时候,不再重新创建num,而是直接使用上次执行之后的值。
💫值得注意的是(通过监控发现):对于被用static修饰后的num 在第4行就可以看到num的值和地址了,并且在后续执行中会直接跳过第5行(创建),可以见得——该变量并不是在执行过程中被创建的,而是在编译期间就分配好了内存并赋予了值。
💫static修饰的变量会在程序结束时还给操作系统。

但是原因是什么呢?
🌟我们可以将内存大概分为3个区域——栈区,堆区,静态区。

在static 修饰局部变量后,会使得变量的存储类型从栈区改变为静态区,使得这个静态变量的生命周期变长,直到程序结束时才会被销毁,但是作用域不变

修饰全局变量

看个例子:

我们可以发现由于static修饰了num,程序报错了。
❔ 怎么回事呢❔

🌟全局变量具有外部链接属性,所以在其他源文件内部都可以使用,而static 修饰全局变量后,改变了这个全局变量的链接属性,由外部链接属性变为了内部链接属性从而使得这个静态变量只能在自己的源文件内部使用,不可以在其他源文件内部使用。

修饰函数

和全局变量几乎时一样的,都是由于static的修饰,使得从外部链接属性变为了内部链接属性。


关键字register的大概了解

register ——寄存器
仅仅有建议作用
电脑数据大概存放:

register int num = 0;
建议将数据放在寄存器中,但最终是否放在寄存器,由编译器自行判断。

#define定义常量和宏

定义标识符常量 例如:#define MAX 10
定义宏:
例如:

#define ADD(x, y) ((x)+(y))
//     名字 参数   实现体

如何使用:(例如实现加法)

#include<stdio.h>
#define ADD(x, y) ((x)+(y))
//     名字 参数   实现体
int main()
{
	int num1 = 2;
	int num2 = 10;
	int sum = ADD(num1, num2);
	printf("%d\n", sum);
	return 0;
}

注意:宏和标识符常量都是替换,int sum = ADD(num1, num2); 相当于 sum = ((num1)+(num2));

结构体

结构体可以描述一个复杂对象,关键字为struct。
例如:描述一个学生。学生有 名字,年龄,性别,学号这几个属性,我们就可以通过各种类型的数据结合在一起去描述学生等一系列的复杂对象。
例如:

struct stu
{
	char name[20];
	int age;
	char sex[5];
	char number[20];
};

注意:一个汉字是两个字符

使用:

#include<stdio.h>
struct stu
{
	char name[20];
	int age;
	char sex[5];
	char number[20];
};

int main()
{
	struct stu s = { "张三",18,"男","123456789" };//初始化
	printf("%s %d %s %s\n", s.name, s.age, s.sex, s.number);
	struct stu* p = &s;
	printf("%s %d %s %s\n", p->name, p->age, p->sex, p->number);
	return 0;
}

💞结尾

之后的内容,本小白会持续更新,刚开始写博客,有不足的地方还请各位大佬多多指正,非常感谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/462920.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RuntimeError: “LayerNormKernelImpl“ not implemented for ‘Long‘解决方法

问题出现的场景&#xff1a; 输入&#xff1a; import torch import torch.nn as nn atorch.randint(10,[3,4]) # atorch.DoubleTensor(a) # aa.double() print(a) layer_normnn.LayerNorm(4) layer_norm(a) 我就是想测试一下经过layernorm之后的输出会变成什么样 但是报错…

Pycharm中如何安装 OpenAI ——ChatGPT的python包?

本文由 大侠(AhcaoZhu)原创&#xff0c;转载请声明。 链接: https://blog.csdn.net/Ahcao2008 Pycharm中如何安装 OpenAI ——ChatGPT的python包? 摘要背景安装1、安装前准备2、安装前提条件3、依赖库 最佳安装过程1、检查 VC2、看哪些依赖库未安装3、将未装模块写成 test02.b…

js 打开资源管理器(经典范例:纯前端选择并预览图片)

效果预览 完整代码范例 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport" content"width…

C++STL详解(十) -- 使用哈希表封装unordered_set和unordered_map

文章目录 哈希表模板参数改造针对模板参数V改造增加仿函数获取具体数据类型. 哈希表的正向迭代器正向迭代器中的内置成员:正向迭代器的成员函数 哈希表插入函数的修改(适用于unordered_map)一个类型K去做set和unordered_set他的模板参数的必备条件.unordered_set的模拟实现(完整…

不得不的创建型模式-原型模式

原型模式是一种创建型模式&#xff0c;它通过复制一个已有对象来创建新的对象&#xff0c;而无需知道新对象的具体类型。 原型模型的结构&#xff1a; 下面是一个简单的C实现原型模式的代码示例&#xff1a; #include <iostream> #include <string> #include <…

React markdown 编辑器

react-markdown 是一款 github 上开源的适用于 react 的 markdown 组件&#xff0c;可以基本实现 markdown 的功能&#xff0c;且可以根据自己实际应用定制的 remark 组件。 安装 安装 markdown 预览插件 react-markdown npm install react-markdown或者&#xff1a; yarn …

Flask+mysql简单问答网站(实现公网可访问)

先到github下载仓库文件 https://github.com/QHCV/flask_mysql_blog python版本3.8&#xff0c;提前安装好Mysql数据库 1.安装python包 pip install -r requirements.txt2.修改配置文件config.py Mysql数据库用户名和密码用于发送验证码的邮箱配置 ​ 在设置->账户下开…

数仓建设规划核心问题!

小A进入一家网约车出现服务公司&#xff0c;负责公司数仓建设&#xff0c;试用期主要一项 OKR是制定数据仓库建设规划&#xff1b;因此小 A 本着从问题出发为原点&#xff0c;先对公司数仓现状进行一轮深入了解&#xff0c;理清存在问题&#xff0c;然后在以不忘初心原则提出解…

提取文本的摘要snownlp模块

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 提取文本的摘要 snownlp模块 [太阳]选择题 关于以下python代码说法错误的一项是&#xff1f; from snownlp import SnowNLP myText """ChatGPT的出现标志着人类科技发…

CSS3 grid网格布局

文章目录 CSS3 grid网格布局概述grid属性说明使用grid-template-rows & grid-template-columns 定义行高和列宽grid-auto-flow 定义项目的排列顺序grid-auto-rows & grid-auto-columns 定义多余网格的行高和列宽row-gap & column-gap 设置行间距和列间距gap 简写形…

Java版spring cloud 本工程项目管理系统源码-全面的工程项目管理

​ ​工程项目管理系统是指从事工程项目管理的企业&#xff08;以下简称工程项目管理企业&#xff09;受业主委托&#xff0c;按照合同约定&#xff0c;代表业主对工程项目的组织实施进行全过程或若干阶段的管理和服务。 如今建筑行业竞争激烈&#xff0c;内卷严重&#xff0c…

Leetcode605. 种花问题

Every day a leetcode 题目来源&#xff1a;605. 种花问题 解法1&#xff1a;贪心 贪心思想&#xff1a;在不打破种植规则的情况下种入尽可能多的花&#xff0c;然后用“最大种植数量”和“所需要种植数量”进行大小比较即可。 设地块长度为n&#xff0c;种花的情况可分为4…

分享一个菜单标签页动画,切换丝滑无比

先上效果图: 代码如下,复制粘贴大法拿走即可使用: <!DOCTYPE html> <html lang="en"> <head>

win系统使用frp端口映射实现内网穿透,配置“任务计划程序”提高稳定性

Github下载最新版frp: https://github.com/fatedier/frp/releases/download/v0.48.0/frp_0.48.0_windows_amd64.zip 解压把frpc.exe和frpc.ini放到D:\program\frp目录下&#xff0c;修改frpc.ini内容如下&#xff1a; [common] server_addr 服务器域名或IP&#xff0c;假设…

Dockerfile镜像LNMP的实战

Dockerfile镜像LNMP的实战 环境准备关闭防火墙拉取centos:7镜像自定义网络 部署nginx&#xff08;容器IP 为 172.18.0.10&#xff09;部署mysql&#xff08;容器IP 为 172.18.0.20&#xff09;部署php&#xff08;容器IP 为 172.18.0.30&#xff09; 环境准备 关闭防火墙 [ro…

taro之项目初始化模板

项目初始化模板 一直以来&#xff0c;在使用 Taro CLI 的 taro init 命令创建项目时&#xff0c;CLI 会提供若干内置模板给开发者选择。但是很多团队都有自己独特的业务场景&#xff0c;需要使用和维护的模板也不尽一致&#xff0c;因此 Taro 支持把项目模板打包成一个能力赋予…

JavaScript奇技淫巧:debugger拦截

debugger指令&#xff0c;一般用于调试&#xff0c;在如浏览器调试执行环境中&#xff0c;可以在JavaScript代码中产生中断。 如果想要拦截debugger&#xff0c;是不容易的&#xff0c;常用的函数替代、proxy方法均对它无效&#xff0c;如&#xff1a; window.debugger (fun…

电脑音乐相册软件推荐 电脑音乐相册制作方法

音乐相册就是把照片剪辑成视频&#xff0c;并配上动听的音乐。音乐相册很适合保存照片&#xff0c;记录生活&#xff0c;传达出拍摄者当时的心情。下面为大家带来电脑音乐相册软件推荐&#xff0c;电脑音乐相册制作方法。 一、电脑音乐相册软件推荐 很多小伙伴在制作音乐相册…

大数据Doris(三):Apache Doris分布式部署准备工作

文章目录 Apache Doris分布式部署准备工作 一、Apache Doris下载 二、节点划分 三、节点配置 1、设置文件句柄数 2、时间同步 3、关闭 Swap 分区 4、调大单个进程的虚拟内存区域数量 Apache Doris分布式部署准备工作 部署Apache Doris时需要分别部署FE、BE、Broker。然…

iOS - RunLoop 基本原理介绍

一、Runloop 简介 Runloop 是通过内部维护事件循环来对事件/消息进行管理的一个对象。 事件循环&#xff08;状态切换&#xff09; 没有消息需要处理时&#xff0c;休眠以避免资源占用&#xff08;用户态 -> 内核态&#xff09;有消息需要处理时&#xff0c;立刻被唤醒&a…