第一行代码,数据存储,数据类型和变量

本文围绕 C/C++ 编程展开,介绍了第一行代码及编译执行方法,如 C++ 用 g++ 编译,C 语言用 GCC 编译。还阐述了计算机数据存储单位、常用进制,以及原码、反码和补码。对常量和数据类型进行初步讲解,包括字符常量、字符集等,重点介绍了 C/C++ 基本数据类型和变量定义及常见问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一行代码,常量,数据类型

1. 第一行代码
1.1 第一行 C++ 代码
// [固定格式] 必要的资源引入,iostream 是 C++ 中的标准输入输出库
#include <iostream>

// [固定格式] 使用指定的 namespace 命名空间,限制代码可以使用的范围
using namespace std;

// [固定格式] main 函数,当前函数是整个程序的入口
// 小括号中是必要的参数信息,目前无需使用,按照规范完成
int main(int argc, char * argv[])
{
	// 有 vim 配置插件配合,默认缩进 4 个字符,如果误删,使用 tab 键对齐
	// 在终端打印展示 hello world
	cout << "Hello World!你好,世界!" << endl;
}
1.2 编译执行 C++ 程序

C++ 代码目前 CPU 无法识别,CPU 有且只识别二进制内容,需要进行【编译】操作,得到可执行文件。

需要使用的工具

  • g++ C++ 代码编译工具
theo@theo:~/C/Day02$ g++ 01_第一行C++代码.cpp
# g++编译器编辑结果,默认得到一个 a.out 可执行文件
theo@theo:~/C/Day02$ ./a.out 
# 执行 C++ 编译结果的 a.out 可执行文件,得到程序结果
Hello World!!!

c++编译执行流程

1.3 C 语言第一行代码
// C 语言标准输入输出头文件,最基本的 C 语言头文件
# include <stdio.h>

// main 函数是整个程序的入口
int main(int argc, char * argv[])
{
	/*
	 * 在控制台打印展示 hello world
	 *  
	 * %s 是 C 语言打印使用的类型标记,对应的字符串
	 */
	 printf("%s\n", "Hello World!");
	  
	 return 0;
}
1.4 编译执行 C 语言程序

需要使用的编译工具是 GCC,编译格式

theo@theo:~/C/Day02$ gcc 01_第一行代码.c
	# 整体格式可以总结为 gcc 目标C语言文件.c 
	# 得到的最终可执行文件是一个 a.out,默认的文件名称和类型,.out 在 Linux 系统中是终端可执行文件,类似于 Windows 操作系统的 exe 文件

执行 a.out 终端可执行文件

theo@theo:~/C/Day02$ ./a.out
	# ./ 表示当前工作目录的文件,. 表示当前工作目录 / 是路径分隔符
	# a.out 是可执行文件
	# 执行结果
Hello World!
1.5 第一行代码问题总结
  • 注意拼写错误,可以根据颜色提示来进行初步的判断,编译过程也会明确提示错误信息。
  • 标点符号一定是英文的,并且成双成对的标点符号一次完成,防止丢失,例如 () ,[], {}, “”, ‘’,<>
  • 代码文件存储规范,命名规范
  • 注意代码格式,缩进对齐,必须提供必要的空格空行
2. 数据存储
2.1 计算机数据存储单位

【重点】
计算机最小存储单元是字节 (byte), 一个字节对应 8 个 bit 位(二进制)

常用存储单位的禁止关系:
	1 KB ==> 1024 Byte
	1 MB ==> 1024 KB
	1 GB ==> 1024 MB
	1 TB ==> 1024 GB
	
	生产过程中使用进制是 1000 【了解】
2.2 数据常用进制
开发中常用的进制:
	十进制,二进制,八进制和十六进制
进制基数范围进制关系
十进制0 ~ 9逢 10 进一
二进制0, 1逢 2 进一
八进制0 ~ 7逢 8 进一
十六进制0 ~ 9, A ~ F逢 G (16) 进一

数据要求规范

进制转换工作,推荐使用计算机提供的计算器工具【程序员模式/编程模式】

二进制:
	0001 1001(2) = 对应十进制 => 25(10)
    例如:
    	寄存器内存状态所需 0111 0110(2) ==> 提供十进制数据 118(10)

八进制:
	数据格式要求 0 开头,在一些特定情况下,开头的 0 标记可以省略
	0777(8) ==> 511(10)
	0775(8) ==> 509(10)

十六进制:
	数据格式要求 0x 开头,而且英文字母不区分大小写
	0x111ABC <= 对应计算机而言,数据完全一致 => 0x111abc
	0xFFFF FFFF 
	0x0
	【重点】十六进制常用于内存地址编号
2.3 原码,反码和补码【了解,计算机规则】

冯·诺依曼 计算机之父

  • 二进制计算机理论,包括原码,反码和补码
  • 万物皆文件思维,可以通过读写操作,控制计算机所有内容。

原码,反码和补码用于降低计算机的运算逻辑复杂度,提升计算机性能,优化计算机电路设计。

利用正整数和负整数演示原码,反码和补码

案例:
	118 + (-118) = 0;

正整数:
	原码,反码和补码一致,都是当前正整数对应的二进制数据情况
	118(10) ==> 0111 0110(2)
	当前的二进制数据就是正整数 118 的原码,反码和补码,也是当前 118 在内存中的存储形式。

负整数:
	-118
	原码: 对应正整数二进制数据存储情况,最高位改为 1 表示符号位,负数形式
         118(10) ==> 0111 0110(2)
        -118(10) = 原码 => 1111 0110(2)
    反码: 负数原码除符号位之外,其他位置按位取反
    	-118(10) = 原码 => 1111 0110(2) 
    	         = 反码 => 1000 1001(2)
   	补码: 反码 + 1
   		-118(10) = 原码 => 1111 0110(2) 
   	     		 = 反码 => 1000 1001(2) 
   			     = 补码 => 1000 1010(2);
【负数在内存中采用补码存储】

原码反码补码最终运算结果
负数原码反码补码推演案例

3. 常量和数据类型初步了解
3.1 什么是常量

在生活中,开发中不可以修改的量,都是【常量】,包括但是不限于数值。

数值相关:
	1 2 3 4 5 ==> 整数
	3.14 0.618 9.8 ==> 小数/浮点数

文字相关:
	字符常量使用英文单引号包含,并且 C/C++ 不推荐使用单引号包含中文
	'1' '2' '3' '4' '5' ==> 数字字符
	'A' 'B' 'C' ==> 英文字母
	'中' ==> 中文汉字

文本: ===> 字符串
	字符串常量使用英文双引号包含,双引号内部的所有内容都是字符串内容。
	"晋太元中,武陵人捕鱼为业..."
	"庆历四年春, 滕子京谪守巴陵郡..."
	"曲曲折折荷塘上面,弥望着田田的叶子..."
3.2 代码演示常量内容
  • C++ 演示
#include <iostream>

using namespace std;

int main(int argc, char * argv[])
{
	// 整数常量
	cout << 7 << endl;
	cout << 100  << endl;
	
	// 小数/浮点数常量
	cout << 3.141592653 << endl; // 终端展示 3.14159
	cout << 6.18 << endl;

	// 文字/字符常量
	// [要求] 使用英文单引号包含
	cout << 'A' << endl;
	cout << '9' << endl;
	
	// 文本/字符常量
	// [要求] 使用英文双引号包含
	cout << "奔驰 S580 V12 " << endl; 
	cout << "沃尔沃 XC90 S90 V90" << endl;
	cout << "阿尔法罗密欧 朱丽叶" << endl;
	
	// 布尔类型,表示真假关系 true 对应 1 false 对应 0
	cout << true << endl;
	cout << false << endl;
}
  • C 语言演示
#include <stdio.h>

int main(int argc, char * argv[])
{
	// 整数常量显示
	printf("整数:%d\n", 10);
	printf("整数:%d\n", 58);
	printf("整数:%d\n", 27);

	// 浮点数常量演示
	printf("浮点数:%f\n", 3.14);
	printf("浮点数:%f\n", 77.34);
	printf("浮点数:%f\n", 5.123);

	// 字符常量演示,字符要求使用英文单引号包含的内容,C/C++ 不推荐包含中文
	printf("字符:%c\n", 'A');
	printf("字符:%c\n", '*');
	printf("字符:%c\n", '数');
	printf("字符:%c\n", '1');

	// 字符串常量
	printf("字符串常量:%s\n", "该吃饭了!!");

	return 0;
}
3.3 字符常量补充
3.3.1 字符常量概述

任何一个字符对于计算机而言都是一个【图片】,在计算机中使用一个表格,对每一个图标进行编号处理,在使用字符数据过程中,计算机会根据对应的编号,选择对应的字符内容进行展示。

3.3.2 字符集

计算机中常用的字符集

  • GBK 中国新国标,包括中文简体字和少数民族文字
  • UTF-8 万国码,支持中文,英文还有其他国家文字
  • ASCII 码,美国信息交互标准协会指定的编码,主要包含内容是英文字母,标点符号,数字字符和键盘特定按键,国际规范要求,所有在计算机中使用的字符集前 0 ~ 127 必须是 ASCII 码
    1. ASCII 中 0 ~ 31 编码对应的字符是不可见字符
    2. ASCII 中数字字符顺序为 ‘0’ ~ ‘9’【重点】
    3. ASCII 中英文字母大写编码值小于小写编码值【重点】
    4. ASCII 中英文字母大小写非连续,中间有其他标点符号【重点】
    5. 【重点/规范】操作使用字符常量,必须使用字符本身,不允许使用编码值
"hello World"; // 正常使用
"10410110810811132119111114108100" 
    // 非法使用,不建议使用编码值对应字符内容,阅读性基本没有。

十进制ASCII码
八进制ASCII码

3.3.3 转义字符【了解】

转义字符

  • 有特定限制的字符内容,转换为无意义字符,例如:
\"  转义双引号:双引号是有限制意义的字符,在双引号前加上反斜杠可以把双引号转换为无意义字符,直接打印出双引号。
\'  转义单引号
\\  转义反斜杠
\\\\ 转义两个反斜杠
  • 无特定含义字符,转换为带有特征性的操作字符
\n 回车,相对于 Enter 键
\t 制表符,相对于 Tab 键
\a 蜂鸣器 alter
3.4 补充

一个来自 2015 年的面试题

请问
	\40 是什么???
		1. \ 是一个转义字符标记
		2. \ 之后要求的数据可以是八进制数据
		3. 八进制数据可以省略标记 0
	\40 ==> 八进制对应 040 字符 ==> sp 空格

【重点知识】
	'\0' 表示编码集当中编号为 0 字符,为不可见字符,字符标记为 nul
4. 数据类型【重点】
4.1 C/C++ 基本数据类型
  1. 整数: 一般用于存储整数相关数据内容,支持负数和正数,同时可以选择当前数据非负数
数据类型占用内存空间字节数存储数据范围(无符号和有符号)
short2个字节(16bit)0 ~ 65535 or -32768 ~ 32767
int在 32 位机及其以上占 4 个字节(32bit)0 ~ 2^32 - 1 or -2^31 ~ 2^31 - 1
long在 64 位机及其以上占 8 个字节(64bit)0 ~ 2^64 - 1 or -2^63 ~ 2^63 - 1

int 类型占用内存字节数补充

  • 在 32 位机器及其以上占用内存空间字节数是 4 字节
  • 16 位机器对应 2个字节,8 位机器对应 1 个字节

long 类型占用内存字节数补充

  • 在 64 位机器及其以上占用内存空间字节数是 8 字节
  • 32 位机器对应 4 个字节
  1. 浮点数: 用于存储小数数据,存在单精度和双精度情况,主要区别是数据存储范围和数据存储精度
数据类型占用内存空间字节数存储数据范围
float4 个字节(32bit)10^38
double8 个字节(64bit)10^308

float 单精度浮点类型 和 double 双精度浮点类型

  • float 数据存储范围小于 double
  • float 数据精度没有 double 高
  • 浮点数据精度情况在特定情况下无法满足开发需求,可能需要其他类型支持。
  1. 字符类型
数据类型占用内存空间字节数存储数据范围
char1个字节(8bit)可以存储英文和标点符号
  1. 布尔类型

C++ 补充数据类型,在 C 语言中不支持

数据类型占用内存空间字节数存储数据范围
bool1个字节(8bit)true(1) or false(0)
4.2 变量【重点】
4.2.1 变量定义基本格式
格式: 数据类型 变量名 = 初始化数据;

“数据类型”:
	目前选择 C 语言基本数据类型作为当前变量选择类型,后续的数据需要满足类型需求,严格遵守数据类型一致化要求。
	1. 考虑存储的数据形式
	2. 考虑数据存储的数据范围,够用就行
	3. 考虑数据存储的后续变化范围【关注点】,例如: 立方数据,阶乘,斐波那契数列

“变量名”:
	1. 要求见名知意,推荐
		小驼峰命名法 studentName studentScore
		下划线命名法 student_name student_score
	2. 要求全部使用英文单词
	3. 变量名在一定范围内唯一
	4. 变量名是操作当前变量的关键名称

“=”:
	1. 名称为【赋值号】
	2. 赋值号,将赋值号右侧的数据,赋值给左侧的变量
	左侧要求必须是一个变量,不可以是其他内容。

“初始化数据”:
	1. 根据当前数据类型,合理合法的初始化数据内容
	2. C/C++ 语言变量如果没有赋值数据的情况下,有可能会导致数据错乱,存在【野值】问题
	
“;”:分号不要忘。
4.2.2 变量定义案例
  • 整数案例

    • C++ 案例

      #include <iostream>
      
      using namespace std;
      
      int main(int argc, char * argv[])
      {
      	// 数据类型 变量名 = 初始化数据;
      	// 整型变量定义
      	short num1 = 10;
      	int num2 = 20;
      	long num3 = 100;
      
      	// num1 num2 num3 都是变量,后续操作可以使用
      	cout << "num1 = " << num1 << endl;
      	cout << "num2 = " << num2 << endl;
      	cout << "num3 = " << num3 << endl;
      	
      	// sizeof 是获取数据类型,变量占用的内存空间字节数
      	cout << "sizeof(short) = " << sizeof(short) << endl;
      	cout << "sizeof(int) = " << sizeof(int) << endl;
      	cout << "sizeof(long) = " << sizeof(long) << endl;
      }
      
    • C 语言案例

      #include <stdio.h>
      
      int main(int argc, char *argv[])
      {
      	/*
      	 * 变量定义格式:
      	 *			数聚类型 变量名 = 初始化数据;
      	 */
      	// 当前定义的变量,变量数据类型为 short 类型,变量名为 num1
      	// 存储数据为 10
      	short num1 = 10;
      
      	// 变量数据类型为 int 类型,变量名为 num2
      	// 存储数据为 100
      	int num2 = 100;
      	
      	// 数据存储类型为 long 类型,变量名为 num3 
      	// 存储数据为 10000
      	long num3 = 10000;
      
      	printf("num1 = %d\n", num1);
      	printf("num2 = %d\n", num2);
      	printf("num3 = %ld\n", num3);
      
      	// 03_整型变量定义案例.c:37:15: warning: overflow in implicit constant conversion [-Woverflow]
      	//   short num5 = 100000;
      	// 100000 超出了 short 类型支持的数据范围
      	short num5 = 10000;
      	printf("num5 = %d\n", num5);
      
      	return 0;
      
      }
      
  • 浮点型

    浮点类型常量赋值建议:

    浮点类型常量,例如 3.14 对于计算机而言,默认数据类型为 double 类型,因为计算机仅考虑当前数据的精度完整,数据内容存储完整,不考虑数据占用的空间问题。

    【建议】如果使用常量浮点类型数据给予 float 类型数据赋值操作,需要在常量之后加上一个大写的 F

    float num1 = 3.14; // 正确方式,但是 3.14 计算机默认为 double 类型
    // 优化
    float num1 = 3.14F; // 明确告知编译器,当前 3.14F 是一个 float 类型数据。
    
    • C++ 案例
    #include <iostream>
    
    using namespace std;
    
    int main(int argc, char * argv[])
    {
    	// 数据类型 变量名 = 初始化数据;
    	// 浮点类型变量
    	float num1 = 3.14F; // F 明确告知编译器,当前的 3.14 为 float 类型
    	double num2 = 3.14;
    
    	cout << "num1 = " << num1 << endl; 
    	cout << "num2 = " << num2 << endl; 
    
    	cout << "sizeof(float) = " << sizeof(float) << endl; 
    	cout << "sizeof(double) = " << sizeof(double) << endl; 
    	
    	cout << "sizeof(3.14F) = " << sizeof(3.14F) << endl;  // 4 个字节
    	cout << "sizeof(3.14) = " << sizeof(3.14) << endl;   // 8 个字节	
    }
    
    • C 语言案例

      #include <stdio.h>
      
      int main(int argc, char * argv[])
      {
      	/*
      	 * 数据类型 变量名 = 初始化数据;
      	 */
      	/*
      	 * 定义一个 float 类型变量,变量名为 num1 
      	 * 初始化数据赋值为 3.5
      	 *
      	 * [建议] 3.5 常量之后使用大写 F 明确告知编译器
      	 * 当前 3.5 是一个 float 类型数据,默认情况下,计算机
      	 * 为了保证数据的精度和范围,所有的浮点数常量
      	 * 默认数据类型为 double 类型。
      	 *
      	 * [严格遵守数据类型一致化原则]
      	 */
      	float num1 = 3.5F;
      
      	/*
      	 * 定义一个 double 类型变量,变量名为 num2 
      	 * 初始化数据赋值为 3.5
      	 * */
      	double num2 = 3.5;
      
      	printf("float = %f\n", num1);
      	printf("double = %f\n",num2);
      
      	return 0;
      }
      
  • 字符类型和布尔类型

    • C++ 案例

      #include <iostream>
      
      using namespace std;
      
      int main(int argc, char * argv[])
      {
      	// 数据类型 变量名 = 初始化数据;
      	// 字符类型和布尔类型
      	char ch1 = 'A'; 
      	char ch2 = '3'; 
      	// 字符类型占用内存空间 1 个字节,中文一般占用 2 - 3 个字节
      	// 无法保存,存在乱码
      	char ch3 = '中'; 
      
      	cout << "ch1 : " << ch1 << endl;
      	cout << "ch2 : " << ch2 << endl;
      	cout << "ch3 : " << ch3 << endl;
      	cout << "sizeof(char) : " << sizeof(char) << endl;
      	
      	// ret = 简拼 => result 结果
      	// true 和 false 是 C++ 关键字,C 语言不支持
      	bool ret1 = true; // true(1)
      	bool ret2 = false; // false(0)
      
      	cout << "ret1 : " << ret1 << endl;
      	cout << "ret2 : " << ret2 << endl;
      	cout << "sizeof(bool) : " << sizeof(bool) << endl;
      }
      
    • C 语言案例

      #include <stdio.h>
      
      int main(int argc, char *argv[])
      {
      	/* 
      	 * 数据类型 变量名 = 初始化数据;
      	 */
      	/*
      	 * 使用字符常量给予字符变量进行赋值操作,需要使用字符本身
      	 * 不推荐使用编码值
      	 */
      	char ch1 = 'A';
      	char ch2 = '*';
      	// C/C++ 中字符常量对于单一中文汉字不支持,中文需要采用字符串方式来解决
      	char ch3 = '中';
      
      	printf("ch1 = %c\n" , ch1);
      	printf("ch2 = %c\n" , ch2);
      	printf("ch3 = %c\n" , ch3);
      }
      
4.3 变量定义常见错误/问题总结
4.3.1 常量数据使用建议
  • 使用常量给予 float 类型变量赋值操作,建议采用大写 F 作为常量的结尾修饰
  • 使用常量给予 long 类型变量赋值操作,建议采用大写 L 作为常量的结尾修饰
float num1 = 3.5F;
		// 明确告知计算机,当前 3.5 是一个 float 类型
long num2 = 1000L;
		// 明确告知计算机,当前 1000 是一个 long 类型
// 原则:严格遵守数据类型一致化
4.3.2 变量未定义直接使用【常见】
  • 变量已定义,但是在后续的使用过程中,因为拼写错误导致的变量未定义
  • 变量在使用之前尚未定义,从始至终未定义对应变量

变量未定义错误gcc提示

4.3.3 野值问题【重点,一定要避免】

要求变量在定义之后,如果尚未赋值的情况下,不建议参与除赋值之外的其他操作。因为变量存储的数据内容尚未明确, C/C++ 中对应变量的数据称之为【野值】,无法确定数值

建议变量定义操作时,直接进行必要的初始化操作,防止野值出现

4.3.4 重复定义问题【常见】

变量在一定范围内唯一,不可以重复定义,否则计算机无法对变量名称进行识别。

变量重复定义错误

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值