C数据类型及语句
1 关键字
1.1 数据类型相关的关键字
char:字符型,占1字节。
short:短整型,占 2 个字节。
int:整型,在 32 位系统下占 4 个字节,在 16 平台下占 2 个字节。
long:长整型,32 位系统下占 4 个字节。
float:单浮点型,占 4 个字节。
double:双浮点型,占 8 个字节。
struct:定义结构体。
union:定义共用体。
enum :定义枚举类型。
signed:有符号。
unsigned:无符号。
void:(1)空类型,不能定义变量,没有 void 类型的变量。
(2)void 是用来修饰函数的参数或者返回值,代表函数没有参数或没有返回。
1.2 存储相关关键字
register:(1)修饰寄存器变量,编译时尽量分配在寄存器空间,不一定真的存放在寄存器中。
(2)不能对变量取地址。
(3)register 只能修饰字符型及整型的,同时不能定义数组,空间宝贵。
(4)cpu 取寄存器数据比去内存中拿数据要快。
static:静态,可以修饰全局变量、局部变量、函数。
const:修饰常量,只读。
注:(1)如果以常量初始化 const修饰的只读变量,那么只读变量的值事先存放在“符号常量表中” 不会立即给data开辟空间,当对data取地址时,系统才会为data在内存中开辟空间。

// C++代码,在qt编译结果
#include <iostream> using namespace std; void test() { const int num = 10; int* p = (int*)# *p = 20; cout<<num<<endl<<*p; // num =10,(还是取的符号常量表里的值); *p = 20; } int main(int argc, char *argv[]) { test(); return 0; }
// c语言在vscode上编译结果,结果与上面不一致
#include<stdio.h> #include<string.h> #pragma warning(disable:4996) void test() { const int num = 10; int* p = (int*)# *p = 20; printf("%d\n", num); // num = 20 printf("%d\n", *p);// *p =20 } int main() { test(); return 0; }
(2)如果以变量初始化 const修饰的只读变量 那么只读变量会立即开辟空间(没有符号常量表)
#include <iostream> using namespace std; void test() { int a = 10; const int num = a;// 以变量初始化 const修饰的只读变量,只读变量会立即开辟空间,没有符号常量表 int* p = (int*)# *p = 20; cout<<num<<endl<<*p; // num =20;*p = 20; } int main(int argc, char *argv[]) { test(); return 0; }
(3)const修饰自定义类型变量 (比如结构体,类对象)立即开辟空间 (没有符号常量表)。
extern:外部的,一般用于函数和全局变量的声明。
1.3 控制语句相关的关键字
if选择语句:
if(条件表达式) { 语句1; ... } else { 语句1; ... }
switch 语句:
int n; printf("请输入一个 1~7 的数\n"); scanf_s("%d",&n); switch(n) // n必须为一个整型或枚举类型 { case 1: printf("星期一\n"); break; case 2: printf("星期二\n"); break; default: printf("您的输入有误,请输入 1~7 的数\n"); break; }
for 循环:
int i,sum=0; for(i=0;i<10;i++) { sum = sum +i; }
while循环:
int i=1; int sum=0; while(i<10) { sum = sum +i; i++; }
do-while循环
int i=1; int sum =0; do { sum = sum+i; i++; }while(i<10)
注:continue:结束本次循环,进入下一次循环
1.4 其他关键字
sizeof:计算变量、数组的占用存储空间的字节数。
int a = 10; int num; num = sizeof(a);
typedef:起别名。
// 起别名步骤 int a; int INT32; typedrf int INT32;// 熟悉之后,前面的步骤都可以省略 INT32 b; // 等价于 int b;
#define:定义一个标识符来表示一个常量。标识符不占内存,只是一个临时的符号,预编译后就不存在。
#define NUM 10 // 无分号结尾,只能宏定义常量。
volatile:易改变的,cpu每次重新去内存取值,不使用寄存器中的备份。
volatile int a =10;
2 数据类型
2.1 基本类型
char 、short int 、int、long int、float、double。
注释:
1. char:(1)存放的是字符对应的ASCII值。
(2)‘a’与“a”的区别:‘a’为字符常量,“a”为字符串常量,“a”包含两个字符‘a’和’\0’,编译器自动添加’\0’。

2.2 类型转换
(1)自动转换:低字节=>高字节,保证精度不降低。

注:(1) 表达式中出现了 char 、short int 、int 类型中的一种或者多种,无其他类型了,全部转化为int参与运算,结果也是int型。
(2) 有小数,全部转化为double 类型的参加运算。
(3) 有符号和无符号参与运算,有符号变成无符号参与运算(表达式中无浮点数)。
#include <stdio.h> int main(void) { short a = -8; unsigned short b=7; if(a+b>0) { printf("a+b>0\n");// 输出 } else { printf("a+b<=0\n"); }
printf("%x\n",(a+b)); // oxffffffff(补码):short运算转化为int了。
printf("%d\n",(a+b)); return 0; // -1 : %d输出为有符号数,就是ffffffff的原码值,
}
(4) 赋值语句中等号右边的类型自动转换为等号左边的类型。
(5) 自动类型转化不会影响变量的类型和值,只是在运算过程中临时性转换。

浙公网安备 33010602011771号