[C初阶笔记]P1

什么是C语言

1、机器语言(二进制)>汇编语言(助记符)>高级语言(C、C++等)

2、c语言擅长底层软件开发(操作系统、驱动程序),并不意味着不能开发其他。

C语言更贴近操作系统,写出来的程序可以直接在操作系统上运行。

3、操作系统(软件)通过驱动程序(软件)控制硬件。

4、操作系统之上的是应用层,可装应用软件。

ANSI C

1、美国国家标准局制定标准语法,称为ANSI C,作为C语言最初的标准。

2、为所有人定制一个标准,让所有人交流起来时,表达的意思更加准确。

使用最广泛的标准是C89/C90。

第一个C程序

//standard input output.header
#include<stdio.h>

//main函数主流写法
int main()
{
    printf("hello world!");
    return 0;
}

//其他写法
void main()
int main(void)
int main(int argc,char* argv[])
//argument 参数
//argc表示参数个数(count)
//argv是所有参数构成的字符串数组(vector)

1、C语言程序是从主函数的第一行开始执行的,main函数是程序的入口。

这里的执行指的是生成可执行文件后,可执行文件的执行,不是指代码被编译的顺序。

2、一个项目中可以有多个.c源文件,但是在这多个.c文件中只能有一个.c文件 有且仅有一个main函数。

3、C语言项目中一般创建.c(源文件)用于函数实现 和 .h(头文件)用于函数声明

4、库函数:已经写好的函数,这些函数的功能是简单经常使用,所以当我们需要它的功能时可以直接调用,调用库函数时要包含对应的头文件。

数据类型

1、C语言提供的数据类型叫内置类型,我们也可以自己创造类型(即 自定义类型)。

2、不同数据类型的变量的大小

根据需求,选择对应的数据类型,可以节省空间,可以精确地描述事物属性,每种类型都有存在的意义。

 

  • C语言标准规定:sizeof(long)>=sizeof(int),所以long类型可能是4字节或者8字节,这取决于编译器。

  • float a=55.5f (带小数点的数默认是double类型,如果后面加上f就是告诉编译器a是个float型变量)

  • sizeof返回的是size_t是无符号整型,size_t是标准C库中定义的,在printf函数中的占位符应该使用%u。

  • long是long int的缩写,实际上可以理解为long ”修饰“ int。

局部变量/全局变量

1、局部变量:定义在{}内部,作用域就是最近的一个{}范围内。

#include<stdio.h>
int main()
{
    {
        int a=10;//只要放在大括号内部,就是局部变量。出了大括号范围,变量a就会被销毁。
    }
    printf("%d",a);//变量a在这里就是未声明的标识符
    return 0;
}

2、全局变量:定义在所有的{}之外,作用范围是整个工程。

全局变量使用起来方便,但是为了防止冲突和安全性,尽量避免定义使用全局变量。

3、局部变量与全局变量名字相同冲突时,局部变量优先使用。

#include<stdio.h>
int a=1000;//全局变量
int main()
{
    int a=100;//局部变量
    printf("%d",a);
    return 0;
}
  • 这里不能理解为全局变量a被覆盖,本质上是编译器优先去局部域寻找a,找不到再去全局域中寻找。

  • 不同域中的变量名可以相同

  • 任何情况下都不建议,局部变量名和全局变量名写成一样,因为写成一样后,想要使用全局变量时,可能不知道有个同名的局部变量存在,导致使用错误。

 

关于VS中scanf报错的问题

原因:

scanf函数不会关注数组的大小,会把输入的所有字符全部放进数组里面,当数组空间满了,依然继续往后越界存放数据。所以VS为了安全,不建议使用scanf函数,而是使用scanf_s函数代替。

int main()
{
    char arr[5];
    scanf("%s",arr);//输入abcdefghijk,末尾还有个'\0'。
    printf("%s\n",arr);//输出abcdefghijk
    return 0;
}

解决办法:

  1. VS中创建的.c文件其实是从newc++file.cpp文件中拷贝过来的。

  2. 用everything找到这个文件,将#define _CRT_SECURE_NO_WARNINGS 1放到第一行,然后保存。

  3. 如果没有权限保存,就把这个文件拷贝到桌面,从桌面打开修改保存,再把桌面这个文件拖回原来文件所在位置,并替换掉原来的文件。

  4. #define _CRT_SECURE_NO_WARNINGS 1类似于开头声明scanf是安全的,VS就不会报错了,但是scanf的函数功能没有变,使用时应当注意越界问题。

注意:

由于scanf_s函数只有VS中的msvc能够识别,别的编译器无法识别,所以如果使用它,则该代码就不具备跨平台性。而scanf函数是C语言标准中的函数,那么使用它,代码就具有跨平台性。(所以建议使用scanf,并且留意该函数的风险性)

作用域/生命周期

作用域:变量起作用的范围

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

全局变量作用域:整个工程(在定义全局变量的文件之外的文件中使用前要用extern声明,并且extern声明的内容只在extern所在的作用域起作用)。

生命周期:变量 创建到销毁 之间的时间段

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

全局变量生命周期:是整个程序的生命周期(main函数的生命周期)。

extern

1、extern声明外部符号

//test1.c
int a = 666;
void Print(int a, int b)
{
    printf("%d\n", a + b);
}
//test2.c
int main()
{
    extern int a;//声明本文件之外的全局变量
    printf("%d\n", a);
​
    extern void Print(int a, int b);//声明本文件之外的函数
    Print(6, 6);
    return 0;
}
  • 全局变量和函数都有外部连接属性,如果要在它们的定义之前或者其他文件中使用它们,就要先使用extern进行声明。

  • extern声明的内容只能在extern所在的作用域内起作用。

  • extern声明的格式,就是在原来的函数声明和变量声明的前面加extern。

  • 声明就是编译的时候告诉编译器,这个变量/函数是在其他文件定义的,接下来使用时,先别报错先允许编译通过,等到链接的时候去别的文件中引用过来使用。

声明/定义

1、声明不会分配空间,定义会分配空间。

2、声明可以重复,定义不能重复。

头文件中不要定义全局变量,如果定义了,当头文件被其他多个文件包含后,头文件会在这多个文件中展开,链接时.o文件都会合并到一起,这时全局域中会有多个相同的全局变量,继而产生冲突。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android多屏幕支持-Android12

Android多屏幕支持-Android12 1、概览及相关文章2、屏幕窗口配置2.1 配置xml文件2.2 DisplayInfo#uniqueId 屏幕标识2.3 adb查看信息 3、配置文件解析3.1 xml字段读取3.2 简要时序图 4、每屏幕焦点 android12-release 1、概览及相关文章 AOSP > 文档 > 心主题 > 多屏…

Mac M2 Pro安装使用Cocoapods

Mac Pro M2安装使用Cocoapods 在新公司要做iOS开发&#xff0c;所以在新电脑上安装Cocoapods 在升级gem&#xff0c;sudo gem update --system&#xff0c;和安装cocoapods时都遇到如下的提示&#xff1a; ERROR: While executing gem ... (Errno::EPERM)Operation not per…

关于使用pycharm遇到只能使用unittest方式运行,无法直接选择Run

相信大家可能都遇到过这个问题&#xff0c;使用pycharm直接运行脚本的时候&#xff0c;只能选择unittest的方式&#xff0c;能愁死个人 经过几次各种尝试无果之后&#xff0c;博主就放弃死磕了&#xff0c;原谅博主是个菜鸟 后来遇到这样的问题&#xff0c;往往也就直接使用cm…

最新Anaconda安装-保姆级教程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 随着人工智能的不断发展&#xff0c;机器学习这门技术也越来越重要&#xff0c;很多…

Linux源码剖析匿名共享内存shmem原理

如下问题如果都清楚了就不用看本文了&#xff1a; 1. shmem ram文件系统的初始化流程是怎样的 2. shmem思想上想复用基于文件的操作流程&#xff0c;实现上shmem也引入了一个文件&#xff0c;那么类似文件open会生成struct file&#xff0c;shmem的struct file怎么生成的 3.…

5款鲜为人知的国产办公软件,可私有化部署,保障内部数据安全

在企业内部办公环境中&#xff0c;如何保障内部数据安全是一项至关重要的事项。为了应对这个挑战&#xff0c;越来越多的企业选择使用私有化部署的办公软件来确保数据的自主性和安全性。下面我将分享5款鲜为人知的国产办公软件&#xff0c;均支持私有化部署&#xff0c;保障企业…

代理设计模式——静态代理和动态代理

代理模式 在代理模式&#xff08;Proxy Pattern&#xff09;中&#xff0c;一个类代表另一个类的功能。这种类型的设计模式属于结构型模式&#xff0c;在代理模式中&#xff0c;我们创建具有现有对象的对象&#xff0c;以便向外界提供功能接口。 意图&#xff1a;为其他对象提…

limereport报表使用

在这里我使用报表是以报表的形式显示数据库的信息。所以首先需要准备的资料有&#xff1a;limereport源码&#xff0c;还有数据库&#xff0c;我这里使用的是qsqlite数据库。 1、下载limereport报表源码 2、运行自带的案例&#xff1a;demo_r1 3、点击 “Run Report Designer”…

PDF文件限制编辑怎么取消?

PDF文件设置了限制编辑&#xff0c;想要取消PDF文件的限制编辑&#xff0c;很简单&#xff0c;打开PDF编辑器&#xff0c;点击工具栏中的文件&#xff0c;选择属性按钮&#xff0c;进入到熟悉感界面之后&#xff0c;点击安全&#xff0c;然后我们点击权限下拉框&#xff0c;选择…

如何使用Spark/Flink等分布式计算引擎做网络入侵检测

如何使用Spark/Flink等分布式计算引擎做网络入侵检测 引言16 Distributed Abnormal Behavior Detection Approach Based on Deep Belief Network and Ensemble SVM Using Spark17 Spark configurations to optimize decision tree classification on UNSW-NB1518 A dynamic spa…

【Pytroch】基于支持向量机算法的数据分类预测(Excel可直接替换数据)

【Pytroch】基于支持向量机算法的数据分类预测&#xff08;Excel可直接替换数据&#xff09; 1.模型原理2.数学公式3.文件结构4.Excel数据5.下载地址6.完整代码7.运行结果 1.模型原理 支持向量机&#xff08;Support Vector Machine&#xff0c;SVM&#xff09;是一种强大的监…

换架 3D 飞机,继续飞呀飞

相信大多数图扑 HT 用户都曾见过这个飞机的 Demo&#xff0c;在图扑发展的这十年&#xff0c;这个 Demo 是许多学习 HT 用户一定会参考的经典 Demo 之一。 这个 Demo 用简洁的代码生动地展示了 OBJ 模型加载、数据绑定、动画和漫游等功能的实现。许多用户参考这个简单的 Demo 后…

Redis进阶(4)——结合redis.conf配置文件深入理解 Redis两种数据持久化方案:RDB和AOF

目录 引出持久化方案RDBAOF Redis的持久化方案RDB如果采用docker stop关闭如果采用强制关闭 AOF参数设置混编方式的加载让aof进行重写 两种持久化方案的优缺点AOF优缺点RDB优势和劣势 总结 引出 1.Redis数据持久化的两种方式&#xff0c;RDB和AOF; 2.RDB采用二进制存储&#xf…

QT报表Limereport v1.5.35编译及使用

1、编译说明 下载后QT CREATER中打开limereport.pro然后直接编译就可以了。编译后结果如下图&#xff1a; 一次编译可以得到库文件和DEMO执行程序。 2、使用说明 拷贝如下图编译后的lib目录到自己的工程目录中。 release版本的重新命名为librelease. PRO文件中配置 QT …

抖音小程序实现less语言编译样式

1.在抖音开发工具中搜索扩展less 2. 然后点击小齿轮选择扩展设置 3. 然后在扩展设置中选择在settings.json中编辑# 4. 在settings.json中加入以下这段代码即可 // Easy LESS配置"less.compile": {"compress": false,//是否压缩"sourceMap": fal…

virtualBox桥接模式下openEuler镜像修改IP地址、openEule修改IP地址、openEule设置IP地址

安装好openEuler后,设置远程登入前,必不可少的一步,主机与虚拟机之间的通信要解决,下面给出详细步骤: 第一步:检查虚拟机适配器模式:桥接模式 第二步:登入虚拟机修改IP cd /etc/sysconfig/network-scripts vim ifcfg-enpgs3 没有vim的安装或者用vi代替:sudo dnf …

优化开发体验:掌握VSCode配置Vue模板的技巧与方法

前言 当你使用了 VSCode 配置 vue 模版时&#xff0c;你会发现它就像是一位贴心的助手&#xff0c;本文将为大家介绍如何使用 VSCode 配置 vue 模板&#xff0c;让你的代码更加高效、美观。下面让我们一起来看看吧。 一、打开 VSCode 控制台 文件 --> 首选项 --> 用户片段…

HOT92-最小路径和

leetcode原题链接&#xff1a;最小路径和 题目描述 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 示例 1&#xff1a; 输入&#xff1a;…

运维工程师常见面试题

1、http常见返回码 2、mysql的同步方式 1&#xff09;异步复制 MySQL默认的复制即是异步的&#xff0c;主库在执行完客户端提交的事务后会立即将结果返给给客户端&#xff0c;并不关心从库是否已经接收并处理&#xff0c;这样就会有一个问题&#xff0c;主如果crash掉了&a…

c++11 标准模板(STL)(std::basic_stringbuf)(二)

定义于头文件 <sstream> template< class CharT, class Traits std::char_traits<CharT>, class Allocator std::allocator<CharT> > class basic_stringbuf : public std::basic_streambuf<CharT, Traits> std::basic_stringbuf…