注释(Comments)可以出现在代码中的任何位置,用来向用户提示或解释代码的含义。程序编译时,会忽略注释,不做任何处理。
C 语言有两种注释方式:
(1)单行注释
以 // 开始的单行注释,这种注释可以单独占一行。
// 单行注释
(2)多行注释
/* */ 这种格式的注释可以单行或多行。
/*
多行注释
多行注释
多行注释
*/
注意:
不能在注释内嵌套注释。
标识符是用来标识变量、函数,或任何其他用户自定义项目的名称。名字不能随便起,要遵守规范;C语言规定:
一个标识符只能由字母(A-Z, a-z )、数字(0-9)和下划线(_)组成,并且第一个字符必须是字母或下划线,不能是数字。
注意:
关键字(Keywords)是由C语言规定的具有特定意义的字符串,通常也称为保留字。这些保留字不能作为常量名、变量名或其他标识符名称。
标准C语言中一共规定了32个关键字。
变量其实是程序可操作的存储区的名称。
C 中每个变量都有特定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上。变量的名称满足 C 标识符规定的。
C 语言允许定义各种其他类型的变量,比如枚举、指针、数组、结构、共用体等等。下面看看几种基本的变量类型:
变量定义就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储。
变量定义指定一个数据类型,并包含了该类型的一个或多个变量的列表。
基本格式如下:type variable_list;
示例如下:
定义整型变量:
int age; //age 被定义为一个整型变量。
定义浮点型变量:
float salary;// salary 被定义为一个浮点型变量。
定义字符型变量:
char grade;// grade 被定义为一个字符型变量。
定义指针变量:
int *ptr; // ptr 被定义为一个整型指针变量。
定义多个变量:
int i, j, k; // 声明并定义了类型为 int的三个变量 i、j 和 k。
在 C 语言中,变量的初始化是在定义变量的同时为其赋予一个初始值。变量的初始化可以在定义时进行,也可以在后续的代码中进行。
初始化器由一个等号,后跟一个常量表达式组成,这个过程叫做赋值(Assign)。赋值是指把数据放到内存的过程。
基本格式如下:
type variable_name = value; // 变量定义并初始化
或者
type variable_name; // 变量定义
variable_name = new_value; // 变量初始化
示例如下:
int x = 10; // 整型变量 x 初始化为 10
float pi; // 浮点型变量pi定义
pi = 3.14159; // 变量pi初始化为3.14159
char ch; // 字符型变量ch定义
ch = 'B'; // 变量ch初始化为字符'B'
extern int d, f;
d = 3;
f = 5; // d 和 f 的声明与初始化
int d2 = 3, f2 = 5; // 定义并初始化 d 和 f
byte z = 22; // 定义并初始化 z
注意:变量在使用之前应该被初始化。未初始化的变量的值是未定义的,可能包含任意的垃圾值。因此,为了避免不确定的行为和错误,建议在使用变量之前进行初始化。
在 C 语言中,如果变量没有显式初始化,那么它的默认值将取决于该变量的类型和其所在的作用域。
对于全局变量和静态变量(在函数内部定义的静态变量和在函数外部定义的全局变量),它们的默认初始值为零。
下面是不同类型的变量在没有显式初始化时的默认值:
需要注意:局部变量(在函数内部定义的非静态变量)不会自动初始化为默认值,它们的初始值是未定义的(包含垃圾值)。因此,在使用局部变量之前,应该显式地为其赋予一个初始值。
总结起来,C 语言中变量的默认值取决于其类型和作用域。全局变量和静态变量的默认值为 0,字符型变量的默认值为 \0,指针变量的默认值为 NULL,而局部变量没有默认值,其初始值是未定义的。
变量声明向编译器保证变量以指定的类型和名称存在,这样编译器在不需要知道变量完整细节的情况下也能继续进一步的编译。变量声明只在编译时有它的意义,在程序连接时编译器需要实际的变量声明。
变量的声明有两种情况:
(1)一种是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。
(2)一种是不需要建立存储空间的,通过使用extern关键字声明变量名而不定义它。 例如:extern int a 其中变量 a 可以在别的文件中定义的。
示例如下:
extern int i; //声明,不是定义
int i2; //声明,也是定义
注意:
除非有extern关键字,否则都是变量的定义。
实例:变量在头部就已经被声明,但是定义与初始化在主函数内:
#include
// 函数外定义变量 x 和 y
int x;
int y;
int addtwonum() {
// 函数内声明变量 x 和 y 为外部变量
extern int x;
extern int y;
// 给外部变量(全局变量)x 和 y 赋值
x = 1;
y = 2;
return x + y;
}
int main() {
int result;
// 调用函数 addtwonum
result = addtwonum();
printf("result 为: %d", result); //result 为: 3
return 0;
}
在 C 语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式。
C 中的类型可分为以下几种:
数组类型和结构类型统称为聚合类型。函数的类型指的是函数返回值的类型。
下面了解基本类型。
下表列出了关于标准整数类型的存储大小和值范围的细节:
注意:
各种类型的存储大小与系统位数有关,但目前通用的以64位系统为主。
以下列出了32位系统与64位系统的存储大小的差别(windows 相同):
示例如下:
#include
#include
int main() {
printf("int 存储大小 : %lu \n", sizeof(int)); // int 存储大小 : 4
return 0;
}
下表列出了关于标准浮点类型的存储大小、值范围和精度的细节:
头文件 float.h 定义了宏,在程序中可以使用这些值和其他有关实数二进制表示的细节。
示例如下:
#include
#include
int main() {
printf("float 存储最大字节数 : %lu \n", sizeof(float));
printf("float 最小值: %E\n", FLT_MIN);
printf("float 最大值: %E\n", FLT_MAX);
printf("精度值: %d\n", FLT_DIG);
return 0;
}
void 类型指定没有可用的值。它通常用于以下三种情况下:
数据长度(Length)是指数据占用多少个字节。占用的字节越多,能存储的数据就越多。
数据是放在内存中的,变量是给这块内存起的名字,有了变量就可以找到并使用这份数据。
多个数据在内存中是连续存储的,彼此之间没有明显的界限,如果不明确指明数据的长度,计算机就不知道何时存取结束。
所以,在定义变量时还要指明数据的长度。而这恰恰是数据类型的另外一个作用。数据类型除了指明数据的解释方式,还指明了数据的长度。因为在C语言中,每一种数据类型所占用的字节数都是固定的,知道了数据类型,也就知道了数据的长度。
为了得到某个类型或某个变量在特定平台上的准确大小,您可以使用 sizeof 运算符。
表达式 sizeof(type) 得到对象或类型的存储字节大小。
示例如下:
#include
#include
int main() {
printf("int 存储大小 : %lu \n", sizeof(int));
printf("char 存储大小 : %lu \n", sizeof(char));
printf("float 存储大小 : %lu \n", sizeof(float));
printf("double 存储大小 : %lu \n", sizeof(double));
printf("short 存储大小 : %lu \n", sizeof(short));
printf("long 存储大小 : %lu \n", sizeof(long));
return 0;
}
类型转换是将一个数据类型的值转换为另一种数据类型的值。C 语言中有两种类型转换:
(1)隐式类型转换
隐式类型转换是在表达式中自动发生的,无需进行任何明确的指令或函数调用。它通常是将一种较小的类型自动转换为较大的类型。
例如,将int类型转换为long类型或float类型转换为double类型。隐式类型转换也可能会导致数据精度丢失或数据截断。
示例如下:
int i = 10;
float f = 3.14;
double d = i + f; // 隐式将int类型转换为double类型
(2)显式类型转换
显式类型转换需要使用强制类型转换运算符(type casting operator),它可以将一个数据类型的值强制转换为另一种数据类型的值。
强制类型转换可以使程序员在必要时对数据类型进行更精确的控制,但也可能会导致数据丢失或截断。
示例如下:
double d = 3.14159;
int i = (int)d; // 显式将double类型转换为int类型
参考文章:
– 求知若饥,虚心若愚。