目录
01. 变量:定义
02. 变量:初始化
03. 变量:参数传递
04. 变量:格式说明符
① 占位符 “%d” 改为格式说明符 “%llu”
② 占位符 “%d” 改为格式说明符 “%f” 或 “%e”
05. 变量:字节数统计
06. 变量:浮点数 float 的最小/大值
01. 变量:定义
未定义变量,直接引用变量时:
- 出现报错:未定义标识符 "a"
- 解决报错:先定义变量
02. 变量:初始化
只定义变量,未初始化变量时,引用变量时:
- 出现报错:C6001: 使用未初始化的内存 "a"。
- 解决报错:定义变量时,同时初始化变量
03. 变量:参数传递
已定义变量,并初始化变量时,传递变量参数时:
- 出现报错:C6271: 传递给 "printf" 的额外参数
- 解决报错:使用占位符 “%d”,需注意传递的参数不能超过格式字符串中占位符的数量
【报错解决详解】
当在调用
printf
函数时,如果传递的参数超过了格式字符串中占位符的数量,就会出现C6271
错误,这个错误是指传递给printf
的额外参数:
- 例如,假设定义了一个整数变量
num
并初始化为10
,然后想将其打印出来,以下是一个正确的示例,因为格式字符串"%d"
中有一个占位符%d
来接收整数参数num
的值,正确代码如下所示:int num = 10; printf("Number: %d\n", num);
- 然而,如果在格式字符串中只有一个占位符
%d
,但传递了多个参数给printf
,就会触发C6271
错误,下述代码中,传递了两个参数num
和20
给printf
函数,但是在格式字符串中只有一个%d
占位符。这就导致了额外的参数无法被正确处理,从而引发了错误,错误代码如下所示:int num = 10; printf("Number: %d\n", num, 20);
- 为了解决这个问题,需要确保传递给
printf
函数的参数的数量与格式字符串中的占位符的数量一致,或者确保占位符的数量与要打印的参数的数量相匹配。例如,如果想将两个整数打印出来,需要使用两个占位符%d,
这样就不会触发C6271
错误了,正确代码如下所示:int num1 = 10; int num2 = 20; printf("Numbers: %d, %d\n", num1, num2);
04. 变量:格式说明符
① 占位符 “%d” 改为格式说明符 “%llu”
已定义变量,并初始化变量时,传递变量参数时:
- 出现报错:C6328: 大小不匹配: 已将 “unsigned _ _int64" 作为 _Param_(2) 传递,但需要使用 "int" 来调用 "printf"。
- 解决报错:解决参数类型不匹配错误,修改 “%d” 为 “%llu”,使用
%llu
格式说明符来与unsigned __int64
类型匹配,其中llu
表示无符号长整型数。
【报错解决详解】
- C6328 错误是由于参数类型不匹配引起的。
- 在代码中,
sizeof(int)
返回一个unsigned __int64
类型的值,但是传递给printf
函数的格式字符串中使用了%d
,这会导致参数类型不匹配错误。- 为了解决这个问题,可以使用
%llu
格式说明符来与unsigned __int64
类型匹配,其中llu
表示无符号长整型数。- 以下是修正后的代码:
#include <stdio.h> int main() { int a = 0; float b = 0; double c = 0; printf("变量名(中文):%d\n", a); printf("变量值(数字):%llu\n" , sizeof(int)); }
- 修复后,
printf
函数的参数类型与格式说明符%llu
相匹配,因此就不会触发 C6328 错误了。
② 占位符 “%d” 改为格式说明符 “%f” 或 “%e”
已定义变量,并初始化变量时,传递变量参数时:
- 出现报错:C6273: 调用 "printf" 实际类型: "double" 时需要整数时,非整数传递为_Param_(2)。
- 解决报错:解决参数类型不匹配错误,修改占位符 “%d” 改为 “%f” 或 “%e” 来打印
FLT_MIN
和FLT_MAX
,这两个值是浮点类型的,而不是整型,应该使用%f
或%e
格式说明符来打印浮点数
【报错解决详解】
- 报错信息提示的问题出现在以下两行代码:
printf("打印浮点数 float 的最小值:%d\n", FLT_MIN); printf("打印浮点数 float 的最大值:%d\n", FLT_MAX);
- 错误原因是使用错误的格式说明符
%d
来打印FLT_MIN
和FLT_MAX
,这两个值是浮点类型的,而不是整型。应该使用%f
或%e
格式说明符来打印浮点数。- 修改后的代码中,使用
%f
替代%d
格式说明符来打印浮点数FLT_MIN
和FLT_MAX
,从而解决了格式化输出的错误。修改后的代码如下:#include<stdio.h> #include <cfloat> int main() { int a = 0; // 定义并初始化整型变量 a float b = 1.5; // 定义并初始化浮点型变量 b double c = 5.78; // 定义并初始化双精度浮点型变量 c /* 参数传递 */ printf("打印变量 a 的值:%d\n", a); // 打印变量 a 的值,使用 %d 格式说明符打印整型值 /* 字节数统计 */ printf("打印 int 的字节数:%llu\n", sizeof(int)); // 使用 sizeof 运算符获取 int 类型的大小并使用 %llu 格式说明符打印无符号长整型值 printf("打印 float 的字节数:%llu\n", sizeof(float)); // 使用 sizeof 运算符获取 float 类型的大小并使用 %llu 格式说明符打印无符号长整型值 printf("打印 double 的字节数:%llu\n", sizeof(double)); // 使用 sizeof 运算符获取 double 类型的大小并使用 %llu 格式说明符打印无符号长整型值 /* 浮点数的最小/大值 */ printf("打印浮点数 float 的最小值:%f\n", FLT_MIN); printf("打印浮点数 float 的最大值:%f\n", FLT_MAX); return 0; }
05. 变量:字节数统计
【示例代码】
#include<stdio.h> int main() { int a = 0; // 定义并初始化整型变量 a float b = 1.5; // 定义并初始化浮点型变量 b double c = 5.78; // 定义并初始化双精度浮点型变量 c /* 参数传递 */ printf("打印变量 a 的值:%d\n" , a); // 打印变量 a 的值,使用 %d 格式说明符打印整型值 /* 字节数统计 */ printf("打印 int 的字节数:%llu\n" , sizeof(int)); // 使用 sizeof 运算符获取 int 类型的大小并使用 %llu 格式说明符打印无符号长整型值 printf("打印 float 的字节数:%llu\n", sizeof(float)); // 使用 sizeof 运算符获取 float 类型的大小并使用 %llu 格式说明符打印无符号长整型值 printf("打印 double 的字节数:%llu\n", sizeof(double)); // 使用 sizeof 运算符获取 double 类型的大小并使用 %llu 格式说明符打印无符号长整型值 }
【代码详解】
- 包含头文件
<stdio.h>
,这是一个标准输入输出库文件,其中包含了printf
函数的声明。- 在
main
函数中,定义了整型变量a
并初始化为0
,定义了浮点型变量b
并初始化为1.5
,定义了双精度浮点型变量c
并初始化为5.78
。- 使用
printf
函数分别打印了变量a
的值、int
类型的大小、float
类型的大小、double
类型的大小;分别使用%d
、%llu
、%llu
、%llu
格式说明符和相应的sizeof
运算符获取变量的值和类型的大小。【输出结果】
- 在大多数编译器中,
sizeof(int)
表达式返回的结果是int
类型在当前编译环境中的字节数。- 通常情况下,
int
类型在大部分平台上占据 4 个字节(32 位),但这并不是绝对的,它可能会在不同的平台和编译器上有所不同。- 因此,当运行
sizeof(int)
时,输出结果为 4,说明在当前编译环境中int
类型占据 4 个字节。- 需要注意的是,
sizeof
运算符返回的是无符号整型值,因此在使用%llu
格式说明符打印sizeof(int)
的结果时,需要使用无符号长整型 (unsigned long long
) 格式来匹配参数的类型。打印变量 a 的值:0 打印 int 的字节数:4 打印 float 的字节数:4 打印 double 的字节数:8
06. 变量:浮点数 float 的最小/大值
【示例代码】
#include<stdio.h> #include <cfloat> int main() { int a = 0; // 定义并初始化整型变量 a float b = 1.5; // 定义并初始化浮点型变量 b double c = 5.78; // 定义并初始化双精度浮点型变量 c /* 参数传递 */ printf("打印变量 a 的值:%d\n", a); // 打印变量 a 的值,使用 %d 格式说明符打印整型值 /* 字节数统计 */ printf("打印 int 的字节数:%llu\n", sizeof(int)); // 使用 sizeof 运算符获取 int 类型的大小并使用 %llu 格式说明符打印无符号长整型值 printf("打印 float 的字节数:%llu\n", sizeof(float)); // 使用 sizeof 运算符获取 float 类型的大小并使用 %llu 格式说明符打印无符号长整型值 printf("打印 double 的字节数:%llu\n", sizeof(double)); // 使用 sizeof 运算符获取 double 类型的大小并使用 %llu 格式说明符打印无符号长整型值 /* 浮点数 float 的最小/大值: %f 格式 */ printf("打印浮点数 float 的最小值:%f\n", FLT_MIN); // 打印浮点数 float 的最小值,使用 %f 格式说明符打印浮点数值 printf("打印浮点数 float 的最大值:%f\n", FLT_MAX); // 打印浮点数 float 的最大值,使用 %f 格式说明符打印浮点数值 /* 浮点数 float 的最小/大值: %e 格式 */ printf("打印浮点数 float 的最小值:%e\n", FLT_MIN); // 打印浮点数 float 的最小值,使用 %e 格式说明符打印浮点数值 printf("打印浮点数 float 的最大值:%e\n", FLT_MAX); // 打印浮点数 float 的最大值,使用 %e 格式说明符打印浮点数值 }
【代码详解】
- 包含了头文件
<stdio.h>
和<cfloat>
分别用于输入输出和浮点数相关常量。- 在
main
函数中,定义了整型变量a
并初始化为0
,定义了浮点型变量b
并初始化为1.5
,定义了双精度浮点型变量c
并初始化为5.78
。- 使用
printf
函数打印了变量a
的值,并使用%d
格式说明符来打印整型值。- 使用
printf
函数分别打印了int
类型、float
类型和double
类型的字节数,并使用%llu
格式说明符和sizeof
运算符来获取并打印无符号长整型值。- 使用
printf
函数分别打印了浮点数float
类型的最小值和最大值,并使用%f
格式说明符来打印浮点数。- 使用
printf
函数分别以科学计数法的格式打印了浮点数float
类型的最小值和最大值,并使用%e
格式说明符来打印浮点数。【输出结果】
%f
是格式说明符,用于打印浮点数的值。%e
是格式说明符,用于以科学计数法打印浮点数的值。- 科学计数法:1.175494e-38 表示为 1.175494 乘以 10 的 -38 次方
- 科学计数法:3.402823e+38 表示为 3.402823 乘以 10 的 38 次方
打印变量 a 的值: 0
:这是因为变量a
被初始化为整型的默认值 0。打印 int 的字节数: 4
:int
类型通常占用 4 个字节(32 位)的内存空间。打印 float 的字节数: 4
:float
类型通常占用 4 个字节(32 位)的内存空间。打印 double 的字节数: 8
:double
类型通常占用 8 个字节(64 位)的内存空间。打印浮点数 float 的最小值: 0.000000
:FLT_MIN
是float
类型的最小正非零值,通常为 0。打印浮点数 float 的最大值: 340282346638528859811704183484516925440.000000
:FLT_MAX
是float
类型的最大值,通常是一个极大的数。打印浮点数 float 的最小值: 1.175494e-38
:这是使用科学计数法表示的float
类型的最小正非零值。打印浮点数 float 的最大值: 3.402823e+38
:这是使用科学计数法表示的float
类型的最大值。打印变量 a 的值: 0 打印 int 的字节数: 4 打印 float 的字节数: 4 打印 double 的字节数: 8 打印浮点数 float 的最小值: 0.000000 打印浮点数 float 的最大值: 340282346638528859811704183484516925440.000000 打印浮点数 float 的最小值: 1.175494e-38 打印浮点数 float 的最大值: 3.402823e+38