C语言进阶之路-基本数据小怪篇

news2024/11/23 2:00:51

目录

一、学习目标:

二、数据基本类型

整型

浮点型 / 实型

字符

字符串

布尔型数据

三、重要的杂七杂八知识点

常量与变量

标准输入

sizeof运算符:

类型转换

数据类型的本质

整型数据尺寸

可移植性整型

拿下第一个C语言程序

总结


一、学习目标:

知识点:

  • 一文掌握 C 语基础数据类型
  • 掌握常量变量运用、输入输出等操作
  • 简单了解内存大小计算和类型转换

二、数据基本类型

整型

  • 概念:表达整数类型的数据
  • 语法:

int a = 123;

// 定义了一个专门用来存储整数的变量a

  • 需要注意的地方:
  1. int 的本意是 integer,即整数的意思
  2. int a 代表在内存中开辟一块小区域,称为 a,用来存放整数,a 一般被称为变量。
  3. 变量 a 所占内存大小,在不同的系统中是不一样的,64位 32 位 系统典型的大小是4个字节
  4. 变量 a 有固定的大小,因此也有取值范围,典型的范围是:-2147483648到2147483647
  • 整型修饰符
    • short:用来缩短整型变量的尺寸,减少取值范围并节省内存,称为短整型
    • long:用来增长整型变量的尺寸,增大取值范围并占用更多内存,称为长整型
    • long long:用来增长整型变量的尺寸,增大取值范围并占用更多内存,称为长长整型
    • unsigned:用来去除整型变量的符号位,使得整型变量只能表达非负整数
short int a; // 短整型 
long int b; // 长整型 
long long int c; // 长长整型 
unsigned int e; // 无符号整型 
unsigned short int f; // 无符号短整型 
unsigned long int g; // 无符号长整型 
unsigned long long int h; // 无符号长长整型
  • 使用整型修饰符后,关键字 int 可以被省略:
short a; // 短整型 
long b; // 长整型 
long long c; // 长长整型 
unsigned e; // 无符号整型 
unsigned short f; // 无符号短整型 
unsigned long g; // 无符号长整型 
unsigned long long h; // 无符号长长整型
  • 符号位:
    • 有符号的整型数据,首位(最高位)为符号位,0表示正数,1表示负数。
    • 无符号的整形数据,没有符号位。
  • 编码形式:
    • 原码:正数直接使用二进制来表达,比如a=100,在内存中是 00…001100100
    • 补码:负数用绝对值取反加一来表达,比如a=-3,在内存中是11…1111111101
    • 补码 = 该负数的绝对值的源码 --> 取反 --> + 1

  • 注意负数的补码在取反加一的时候,符号位是不动的
  • 溢出:超过数据所能表达的范围,称为溢出,就像汽车里程表,最大值和最小值是相邻的

  • 进制:源码中可以使用八进制、十进制或十六进制,但实际数据在内存中一律是二进制存储
    • 十进制(默认),比如1099
    • 八进制,比如013 (这里的0 是八进制的前缀)
    • 十六进制,比如0x6FF0A (0x 则是16进制的前缀)

// 以下3个变量看起来都是 100 但实际由于进制不同则他们表示的数值有有差异:

int a1 = 100 ;     int a2 = 0100;      int a3 = 0x100 ;

格式控制符

十进制输出: int 整型:%d short 整型:%hd, h代表half,即一半的存储字节 long 整型:%ld long long 整型:%lld 八进制输出: 显示不同进制的前缀: %#o 十六进制输出: %#x

示例:

// 以下3个变量看起来都是 100 但实际由于进制不同则他们表示的数值有有差异
int a1 = 100 ;
int a2 = 0100;
int a3 = 0x1AB ;


printf("a1:%d a2:%d a3:%d\n" , a1 , a2 , a3);  // %d 十进制输出整形
printf("a1:%#x a2:%#x a3:%#X\n" , a1 , a2 , a3); // %x 十六进制输出整形  # 则可以输出十六进制的前缀0x
        // x 可以是大写也可以是小写,对应的是十六进制中字符的大小写
        //  %#x  -> 0xab
        //  %#X  -> 0XAB 


short s ;
int i ;
long l ;
long long ll ;

printf( "s:%d\n" , s  );
printf( "i:%d\n" , i  );
printf( "l:%ld\n" , l  );
printf( "ll:%lld\n" , ll  );

浮点型 / 实型

  • 概念:用来表达实数的数据类型
  • 分类:
    • 单精度浮点型(float),典型尺寸是4字节
    • 双精度浮点型(double),典型尺寸是8字节
    • 长双精度浮点型(long double),典型尺寸是16字节
    • 占用内存越多,能表达的精度越高
float f1; // 单精度
double f2; // 双精度 
long double f3; // 长双精度

1234.5678 -> 1.2345678*10^3

0.0001234567 -> 1.234567*10^-4

字符

实际上他就是一个单字节的整形,也可以与整形一样参与运算。

char ch1 = 'a';  // 'a'是字符常量,代表字母a的ascii值 97
char ch2 = '\n'; // '\n'是不可见字符常量,代表回车

        计算机中存储的都是1和0,因此各种字符都必须被映射为某个数字才能存储到计算机中,这种映射关系形成的表称为 ASCII 码表。

字符本质上就是一个单字节的整型,支持整型所有的运算

比如:

char c1 = 20;
char c2 = c1 + 'a'; // 等价于 char c2 = 20 + 97;

printf("%c\n", c2); // 以字符形式输出117,即 'u'
printf("%d\n", c2); // 以整型形式输出117

字符串

  • 定义
// 字符串的定义方式有两种:指针和数组
char *s1 = "abcd"; // 使用字符指针来指向一个字符串
char s2[]= "abcd"; // 使用字符数组来存储字符串

// 注意,使用数组来定义字符串时,方括号[]里面的数字可以省略
// 不省略也可以,但必须必字符串实际占用的内存字节数要大,比如:
char s3[] = "apple";
  • 在内存中的存储
    • 在内存中实际上是多个连续字符的组合
    • 任何字符串都以一个 ‘\0’ 作为结束标记,例如:“funny story” 的内存如下

布尔型数据

  • 概念:布尔型数据只有真、假两种取值,非零为真,零为假。
  • 语法:
bool a = 1; // 逻辑真,此处1可以取其他任何非零数值
bool b = 0; // 逻辑假 
  • 注意:
  1. 逻辑真除了 1 之外,其他任何非零数值都表示逻辑真,等价于 1。
  2. 使用布尔型 bool 定义变量时需要包含系统头文件 stdbool.h。
  • 布尔型数据常用语逻辑判断、循环控制等场合。

三、重要的杂七杂八知识点

常量与变量

  • 概念:不可改变的内存称为常量可以改变的内存称为变量

举例:

int a = 100; // a是变量,而100是常量

float f = 3.14; // f是变量,而3.14是常量

char s[] = "abcd"; // s是变量,"abcd"是常量
  • 常量的类型

常量举例

说明

类型

100

整型

int

100L

长整型

long

100LL

长长整型

long long

100ULL

无符号长长整型

unsigned long long

3.14

双精度浮点型

double

3.14L

长双精度浮点型

long double

‘a’

字符型

char

“abcd”

字符指针(字符串)

char *

标准输入

  • 概念:键盘是系统的标准输入设备,从键盘中输入数据被称为标准输入
  • 相关函数:
scanf(); // 格式化输入函数 
fgets(); // 字符串输入函数

int a;
float f;
scanf("%d", &a);   // 从键盘输入一个整型,放入指定的内存地址 &a 中
scanf("%f", &f);   // 从键盘输入一个浮点数,放入指定的内存地址 &f 中

scanf("%d%f", &a, &f); // 从键盘依次输入一个整型和一个浮点型数据,用空白符隔开

char c;
char s[10];
scanf("%c", &c);  // 从键盘输入一个字符,放入指定的内存地址 &f 中
scanf("%s", s );  // 从键盘输入一个单词,放入指定的数组 s 中(注意不是&s)

fgets(s, 10, stdin); // 从键盘输入一行字符串,放入数组 s 中
  • 注意1:
    • scanf() 与 printf() 不同,scanf() 的格式控制串不可乱写,尤其是结尾处的 \n
    • 用户必须完全按照 scanf() 中描述的输入格式控制串来输入数据,否则将出错。
    • 示例:
// 此处输入时必须带逗号
scanf("%d,%d", &a, &b);

// 此处必须先输入a=,然后才能输入整数
scanf("a=%d", &a); 

// 此处结束输入时按下的回车符将被scanf()误以为格式控制符,无法正常结束输入
scanf("%d\n", &a); 

实例:

#include <stdio.h>

int main(int argc, char const *argv[])
{

    int i = 0;
    char ch = 0;
    float f  = 0;
    char buf [32] = {0};

    // 如下所示,如果在输入多项数据的时候, 从左往右第一项不匹配后会导致往后的所有项目输入终止
    int ret_val = scanf( "a=%d ch=%c f=%f buf=%s" , &i , &ch , &f , buf );
    // 如果输入表达式如上所示使用空格进行分割各种类型的控制符,那么在输入的时候可以匹配空格 、 Tab 、 回车
    // 如果 scanf( "%d,%s,%c" , ...); 这么写在输入时就必须使用 ,(逗号) 进行分割
    // 注意千万不要手贱在 格式控制符中加上 \n 不然会出现迷惑现象,必须多输入一个无用的数据+\n才能解脱

    printf("成功输入:%d项数据..\n" , ret_val);
    printf("i:%d ch:%d f:%f  buf:%s\n" , i , ch , f , buf );
    
    
    return 0;
}

总结:

    • sacnf 它默认从指定的文件(默认是标准输入文件)中获取指定格式的数据。
    • 格式包含 数据的类型(%d %s %c %f ..) 以及 样式(a=%d ch=%c \ %d,%c,%f)
    • 如果输入样式中各项数据使用 空格分隔则与之匹配的符号可以是 空格 、 TAB 、 回车
    • 如果用户输入的数据不匹配则scanf 会立马停止工作,剩余的数据会留在缓冲区

拓展:

sizeof运算符:

 int a = 123 ;

printf("%ld\n" , sizeof a );// 当使用sizeof 求某一个变量的大小时可以省略括号
printf("%ld\n" , sizeof (a) );
printf("%ld\n" , sizeof(int) );


printf("short: %ld\n" , sizeof(short) );  // 2
printf("int :%ld\n" , sizeof(int) );  // 4
printf("long : %ld\n" , sizeof(long) );  // 4(32位系统) / 8(64位系统)
printf("long long :%ld\n" , sizeof(long long ) );  // 8 (32 \ 64 位系统)

类型转换

  • 概念:不一致但相互兼容的数据类型,在同一表达式中将会发生类型转换。
  • 转换模式:
    • 隐式(默认)转换:系统按照隐式规则自动进行的转换
    • 强制(手动)转换:用户显式自定义进行的转换
  • 隐式规则:从小(低精度)类型向大(高精度)类型转换,目的是保证不丢失表达式中数据的精度

隐式转换示例代码

char a = 'a'; int b = 12; float c = 3.14; float x = a + b - c;

// 在该表达式中将发生隐式转换,所有操作数被提升为float
  • 强制转换:用户强行将某类型的数据转换为另一种类型,此过程可能丢失精度
char a = 'a'; int b = 12; float c = 3.14; float x = a + b - (int)c;

// 在该表达式中a隐式自动转换为int,c被强制转为int

        不管是隐式转换,还是强制转换,变换的都是操作数在运算过程中的类型,是临时的,操作数本身的类型不会改变,也无法改变。

数据类型的本质

  • 概念:各种不同的数据类型,本质上是用户与系统对某一块内存数据的解释方式的约定。
  • 推论:
    • 类型转换,实际上是对先前定义时候的约定,做了一个临时的打破。
    • 理论上,可以对任意的数据做任意的类型转换,但转换之后的数据解释不一定有意义。
17620828909 电话 
17620828909 余额
int a = 123 ;
float 123

整型数据尺寸

  • 概念:整型数据尺寸是指某种整型数据所占用内存空间的大小
  • C语言标准并未规定整型数据的具体大小,只规定了相互之间的 “ 相对大小 ” ,比如:
    • short 不可比 int 长 , 一般short为int 的一半
    • long 不可比 int 短
    • long 型数据长度等于系统字长
  • 系统字长:CPU 一次处理的数据长度,称为字长。比如32位系统、64位系统。
  • 典型尺寸:
    • char 占用1个字节
    • short 占用2个字节
    • int 在16位系统中占用2个字节,在32位和64位系统中一般都占用4个字节
    • long 的尺寸等于系统字长 , 在32位系统中4字节, 在64位系统中8字节
    • long long 在32位系统中一般占用8个字节,在64位系统中一般占用8个字节
  • 存在问题:
    • 同样的代码,放在不同的系统中,可能会由于数据尺寸发生变化而无法正常运行。
    • 因此,系统标准整型数据类型,是不可移植的(不具备可移植性),这个问题在底层代码中尤为突出。

可移植性整型

  • 概念:不管放到什么系统,尺寸保持不变的整型数据,称为可移植性整型
  • 关键:typedef (给现有的类型取别名)
typedef int int32_t; // 将类型 int 取个别名,称为 int32_t 
typedef long int64_t;// 将类型 long 取个别名,称为 int64_t
  • 思路:
    • 为所有的系统提供一组固定的、能反应数据尺寸的、统一的可移植性整型名称
    • 在不同的系统中,为这些可移植性整型提供对应的 typedef 语句

#include <stdio.h>


int main(int argc, char const *argv[])
{
    
    long l = 345 ;  // 不具备可移植的属性,因在不不同的系统中他的大小有可能发生变化
    __int64_t  k = 567 ; // 可移植数据类型,在不同的系统中他的大小都是固定的

    printf("long:%ld\n" , sizeof(long));
    printf("long long :%ld\n" , sizeof(long long));

    printf("__int64_t:%ld\n" , sizeof(__int64_t));

    return 0;
}

拿下第一个C语言程序

总结

        本文介绍了C的一些基本类型知识和类型转换要点,还有变量、常量等其他知识。理解本文所有知识点后,便可编译一个属于自己的小程序,算上是窥得C语皮毛矣

        本文参照 粤嵌文哥 部分课件经整理和修改后发布在C站,如有转载,请联系本人

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

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

相关文章

MySQL数据库主从集群搭建

快捷查看指令 ctrlf 进行搜索会直接定位到需要的知识点和命令讲解&#xff08;如有不正确的地方欢迎各位小伙伴在评论区提意见&#xff0c;博主会及时修改&#xff09; MySQL数据库主从集群搭建 主从复制&#xff0c;是用来建立一个和主数据库完全一样的数据库环境&#xff0c…

win10安装pytorch(py39)

cuda≤11.6&#xff0c;观察控制面板 观察torch对应cuda版本 https://download.pytorch.org/whl/torch/ 安装cuda11.6.0 CUDA Toolkit Archive | NVIDIA Developer cmd输入nvcc -V 编辑国内镜像源 .condarc anaconda prompt输入 查看环境 conda env list 安装py3.9…

LedControl 库说明文档

LedControl 库最初是为基于 8 位 AVR 处理器的 Arduino 板编写的。但由于该代码不使用处理器的任何复杂的内部功能&#xff0c;因此具有高度可移植性&#xff0c;并且应该在任何支持 和 功能的 Arduino&#xff08;类似&#xff09;板上pinMode()运行digitalWrite() 。 单个 M…

中电金信:守【政】创新,探路保险数字化转型“新范式”

11月23日&#xff0c;CIIP2023中国保险科技创新合作大会在京举办。大会汇集保险科技领域行业专家、学者、国内外头部险企及保险科技公司负责人等各界人士&#xff0c;立足保险行业高质量发展和创新驱动理念&#xff0c;寻找行业数字化转型新动能、新视角&#xff0c;为保险科技…

【基础知识】AB软件RSLinx如何实现OPC通讯组态

哈喽&#xff0c;大家好&#xff0c;我是雷工。 在上一节了解了什么是RSLinx&#xff1f;以及RSLinx Lite、RSLinx Classice、RSLinx Professional、RSLinx Gateway几个版本的特点。 本节了解AB的RSLinx如何实现OPC组态。 一、创建RSLinx通讯&#xff1a; 1.1、【Communicati…

vue2项目从0搭建(三):配置环境变量及对应的webpack配置

前言 实际业务开发中,一个项目很可能会同时配置好几套环境。 比如:常规开发环境,开发测试环境,正式的测试环境,预发测试环境,客户甲的生产环境,客户乙的生产环境,通用生产环境,独立应用环境,微前端环境,大屏专用环境,移动端环境。 一女多嫁的实际业务场景,就需要我们进行多样…

mac上Homebrew的安装与使用

打开终端&#xff1a;command空格 &#xff0c;搜索‘’终端 ’&#xff0c;打开终端 在终端中输入以下命令并按下回车键&#xff1a; /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"这个命令会自动下载并安装…

某60区块链安全之未初始化的存储指针实战二学习记录

系列文章目录 文章目录 系列文章目录未初始化的存储指针实战二实验目的实验环境实验工具实验原理实验内容实验过程EXP利用 未初始化的存储指针实战二 实验目的 学会使用python3的web3模块 学会分析以太坊智能合约未初始化的存储指针漏洞 找到合约漏洞进行分析并形成利用 实验…

win11渗透武器库,囊括所有渗透工具

开箱即用&#xff0c;最全的武器库&#xff0c;且都是2023年11月最新版&#xff0c;后续自己还可以再添加&#xff0c;下载地址&#xff1a;https://download.csdn.net/download/weixin_59679023/88565739 服务连接 信息收集工具 端口扫描 代理抓包 漏洞扫描 指纹识别 webshel…

apipost接口200状态码,浏览器控制台500状态码

后端 url 登录login方法 login(){this.$refs.loginForm.validate(async valid > {if (!valid) return// 由于data属性是一个json对象&#xff0c;需要进行解构赋值{data:result}&#xff0c;进行状态码判断const {data: result} await this.$http.post(/api/doLogin,this.…

解决在Windows10或Windows11下无权限修改hosts文件

解决在Windows10或Windows11下无权限修改hosts文件&#xff0c;无法写入内容 1、首先在开始菜单中找到这个 2、接着输入&#xff1a; C:\Windows\System32\drivers\etc3、再次输入以下命令行&#xff1a;notepad hosts &#xff0c;并回车&#xff1a; notepad hosts 4、然后…

Java专题(二)反射

反射概述 Java 反射就是在运行的状态下&#xff0c;对于任意一个类&#xff0c;都能知道这个类的任意的属性和方法&#xff0c;并且能调用这些方法或者改变这些类的属性&#xff0c;因此 Java 被称为准动态语言。 动态语言和静态语言 上面说了 Java 是准动态的语言&#xff0c…

面向对象三大特性,类与接口,java重写与重载,对象相等的判断, hashCode 与 equals

文章目录 2.1 面向对象三大特性2.1.1 封装 继承 多态2.1.2 其中Java 面向对象编程三大特性&#xff1a;封装 继承 多态2.1.3 关于继承如下 3 点请记住&#xff1a;2.1.4 什么是多态机制&#xff1f;Java语言是如何实现多态的&#xff1f;2.1.5 Java实现多态有三个必要条件&…

电脑中提示关于ntdll.dll错误怎么办,解决出现ntdll.dll错误的办法

ntdll.dll是Windows操作系统的一个关键系统文件&#xff0c;它包含了许多核心函数和系统调用&#xff0c;对于系统的稳定运行至关重要。然而&#xff0c;有时我们可能会遇到ntdll.dll报错的问题&#xff0c;导致程序无法正常运行。那么今天就和大家谈谈电脑中提示关于ntdll.dll…

企业计算机服务器中了360勒索病毒怎么办,360勒索病毒解密文件恢复

计算机技术的不断发展&#xff0c;为企业的生产运营提供了极大便利&#xff0c;不仅提升了办公效率&#xff0c;还促进了企业的发展。企业计算机在日常工作中一定加以防护&#xff0c;减少网络威胁事件的产生&#xff0c;确保企业的生产生产运营。最近&#xff0c;网络上的360后…

两巨头Facebook 和 GitHub 联手推出 Atom-IDE

9月13日&#xff0c;GitHub 宣布与 Facebook 合作推出了 Atom-IDE —— 它包括一系列将类 IDE 功能带到 Atom 的可选工具包。初次发布的版本包括更智能、感知上下文的自动完成&#xff1b;导航功能&#xff0c;如大纲视图和定义跳转(outline view and goto-definition)&#xf…

爬虫项目实战:利用基于selenium框架的爬虫模板爬取豆瓣电影Top250

&#x1f44b; Hi, I’m 货又星&#x1f440; I’m interested in …&#x1f331; I’m currently learning …&#x1f49e; I’m looking to collaborate on …&#x1f4eb; How to reach me … README 目录&#xff08;持续更新中&#xff09; 各种错误处理、爬虫实战及模…

【JAVA】SpringBoot + mongodb 分页、排序、动态多条件查询及事务处理

【JAVA】SpringBoot mongodb 分页、排序、动态多条件查询及事务处理 1.引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- mongodb ↓ -->&…

2023年亚太杯数学建模A题解题思路(*基于OpenCV的复杂背景下苹果目标的识别定位方法研究)

摘要 由于要求较高的时效性和劳力投入&#xff0c;果实采摘环节成为苹果生产作业中十分重要的一部分。而对于自然环境下生长的苹果&#xff0c;光照影响、枝叶遮挡和果实重叠等情况普遍存在&#xff0c;这严重影响了果实的准确识别以及采摘点的精确定位。针对在复杂背景下苹果的…

android 保活的一种有效的方法

android 保活的一种有效的方法 为什么要保活 说起程序的保活,其实很多人都觉得,要在手机上进行保活,确实是想做一些小动作,其实有些正常的场景也是需要我们进行保活的,这样可以增强我们的用户体验。保活就是使得程序常驻内存,这种程序不容易被杀,或者在被杀以后还能完…