C语言—类型介绍

c语言是什么?

c语言是人与计算机交流的语言,人们通过计算机语言写程序,给计算机下达指令,让计算机工作。c语言就是众多计算机语言中的一种,当然c++/Java/Go/Python都是计算机语言

语言使用变化TIOBE Index - TIOBEhttps://www.tiobe.com/tiobe-index/

C语言编译过程

C语⾔是⼀⻔编译型计算机语⾔,C语⾔源代码都是⽂本⽂件,⽂本⽂件本⾝⽆法执⾏,必须通过编译 器(cl.exe)翻译链接器(link.exe)链接,⽣成⼆进制的可执⾏⽂件(xxx.exe),可执⾏⽂件才能执⾏。

源代码: test.c, add.c, xxx.c  
        ↓ (编译)  
目标文件: test.obj, add.obj, xxx.obj  
        ↓ (链接 + 链接库如 libxxx.lib)  
可执行程序: xxx.exe  

1. 每个源⽂件(.c)单独经过编译器处理⽣成对应的⽬标⽂件(.obj为后缀的⽂件)

2. 多个⽬标⽂件和库⽂件经过链接器处理⽣成对应的可执⾏程序(.exe⽂件)

main函数

• main函数是程序的⼊⼝

• main函数有且仅有⼀个

• 即使⼀个项⽬中有多个.c⽂件,也只能有⼀个main函数(因为程序的⼊⼝只能有⼀个)

#include<stdio.h>

int (表示main函数执行结束返回值的类型)main() {

           printf("hello C\n");//%d , %c 等是占位符,会被后边的值替换。

           return 0;

}

我们在使⽤库函数的时候,是需要包含头⽂件的,⽐如: 在使用printf函数时要用stdio.h 这个头⽂件写成#include<stdio.h>

库函数

https://cplusplus.com/reference/clibrary/https://cplusplus.com/reference/clibrary/

关键字

c语言中32个关键字

auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while

注:C语⾔关键字的全部介绍

https://zh.cppreference.com/w/c/keywordhttps://zh.cppreference.com/w/c/keyword

  • 字符A~Z的ASCII码值从65~90
  •  字符a~z的ASCII码值从97~122
  • 对应的⼤⼩写字符(a和A)的ASCII码值的差值是32
  • 数字字符0~9的ASCII码值从48~57
  • 换⾏ \n 的ASCII值是:10
  •  在这些字符中ASCII码值从0~31这32个字符是不可打印字符,⽆法打印在屏幕上观察 

字符串

使用双引号" "括起来的一串字符就是字符串,用%s打印

C语⾔字符串是⼀个特殊的知识,就是在字符串的末尾隐藏放着⼀个'\0' 的结束标志。

对于字符串"abcdef",我们实际上看到了6个字符:a,b,c,d,e,f,但是实际上在末尾还隐藏⼀个 转义字符, \0 是字符串的结束标志。所以我们在使⽤库函数 \0 的 strlen() 计算字符串⻓度的时候,遇到 printf() 打印字符串或者 \0 的时候就⾃动停⽌了。

#include <stdio.h>
 int main()
 {
 char arr1[] = {'a', 'b', 'c'};//arr1数组中存放3个字符
 
char arr2[] = "abc"; //arr2数组中存放字符串
 
printf("%s\n", arr1);
 printf("%s\n", arr2);
 return 0;
 }

 

可以看到, arr1 字符数组在打印的时候,打印了 a 、 b 、 c 后还打印了⼀些随机值,这就是 因为 arr1 在末尾的地⽅没有 \0 字符作为结束标志,在打印的时候没有停⽌。

但是 arr2 的打印就是完全正常的,就是因为 arr2 数组是使⽤字符串常量初始化的,数组中有 \0 作为结束标志,打印可以正常停⽌ 

这体现了\0的主要性

转义字符

参考:https://zh.cppreference.com/w/c/language/escapehttps://zh.cppreference.com/w/c/language/escape

  • \? :在书写连续多个问号时使⽤,防⽌他们被解析成三字⺟词,在新的编译器上没法验证了。
int main(){
正解:printf("Are you ok\?\?)");---->Are you ok??
printf("(Are you ok??)");//??+字符称为三字母词;//早期??)--->]  ;??[---->[,早期编译器会打印出Are you ok]
return 0;
}

  1. \' :⽤于表⽰字符常量'
  2.  \" :⽤于表⽰⼀个字符串内部的双引号
  3.  \\ :⽤于表⽰⼀个反斜杠,防⽌它被解释为⼀个转义序列符。
  4.  \a :警报,这会使得终端发出警报声或出现闪烁,或者两者同时发⽣。
  5.  \b :退格键,光标回退⼀个字符,但不删除字符。
  6.  \f :换⻚符,光标移到下⼀⻚。在现代系统上,这已经反映不出来了,⾏为改成类似于
  7.  \n :换⾏符。
  8.  \r :回⻋符,光标移到同⼀⾏的开头。
  9. \t :制表符,光标移到下⼀个⽔平制表位,通常是下⼀个4/8的倍数。
  10.  \v :垂直分隔符,光标移到下⼀个垂直制表位,通常是下⼀⾏的同⼀列
  11.  \ddd :ddd表⽰1~3个⼋进制的数字。 如: \130 表⽰字符X
  12.  \xdd :dd表⽰2个⼗六进制数字。 如: \x30 表⽰字符0
  13. \0 :null 字符,代表没有内容, \0 就是 \ddd 这类转义字符的⼀种,⽤于字符串的结束标志,其 ASCII码值是0

C语⾔的代码分为五类:

  • 空语句

  • 表达式语句

  •   函数调⽤语句

  • 复合语句

  • 控制语句

C语⾔有九种控制语句

可分成以下三类:

1. 条件判断语句也叫分⽀语句:if语句、switch语句;

2. 循环执⾏语句:do while语句、while语句、for语句;

3. 转向语句:break语句、goto语句、continue语句、return语句

注释

注释的2种形式:

1 :/**/ 的形式

2 :// 的形式

程序编译时,程序中的注释会换成空格

数据类型(内置类型)

类别数据类型说明典型大小(字节)
1.基本类型
整数类型char字符或小整数(-128~127 或 0~255)1
unsigned char无符号字符(0~255)1
short短整数(-32,768~32,767)2
unsigned short无符号短整数(0~65,535)2
int整数(-2,147,483,648~2,147,483,647)4
unsigned int无符号整数(0~4,294,967,295)4
long长整数(-2³¹~2³¹-1 或 -2⁶³~2⁶³-1,取决于平台)4(32位)或 8(64位)
unsigned long无符号长整数(0~2³²-1 或 0~2⁶⁴-1)4(32位)或 8(64位)
long long更长的整数(-2⁶³~2⁶³-1)8
unsigned long long无符号更长的整数(0~2⁶⁴-1)8
浮点类型float单精度浮点数(约6-7位有效数字)4
double双精度浮点数(约15-16位有效数字)8
long double扩展精度浮点数(精度和大小取决于编译器)8、12 或 16
布尔类型_Bool / bool布尔值(变量的取值是:true/false,C99引入,需<stdbool.h>1
空类型void表示无类型或无返回值
2.派生类型
数组type[size]固定大小的同类型元素集合(如 int arr[10]sizeof(type) × size
指针type *存储内存地址(如 int *ptr4(32位)或 8(64位)
结构体struct用户自定义的复合类型(如 struct Point { int x; int y; };各成员大小之和(可能有对齐填充)
联合体union所有成员共享同一内存空间(如 union Data { int i; float f; };最大成员的大小
枚举enum定义一组命名的整数常量(如 enum Color { RED, GREEN, BLUE };通常与 int 相同(4)
类型限定符const定义不可修改的常量(如 const int x = 5;
volatile表示变量可能被外部因素修改(如硬件寄存器)
restrict (C99)限定指针访问的独占性(优化提示)
类型定义typedef创建类型别名(如 typedef int myInt;取决于原类型
复杂类型 (C99)_Complex复数(需<complex.h>,如 double complex z = 1.0 + 2.0*I;通常 16(2×double
_Imaginary虚数(较少支持)取决于实现
  • 大小可能因编译器和平台不同(如 long 在 Windows 32/64位下为 4 字节,Linux 64位下为 8 字节)。

  • sizeof 运算符 可获取具体平台上的类型大小(如 sizeof(int))。

  • C99/C11 标准 引入了 _Boollong long_Complex 等类型。

C语言中基本数据类型在printfscanf中使用的格式说明符表格:

数据类型printf 格式说明符scanf 格式说明符备注
int%d 或 %i%d 或 %i十进制有符号整数。
short int可以用 %hd(推荐),但 %d 通常也能正常工作(因为 short 会被隐式提升为 int)。%hd短整型,h 表示 "short"。
long int%ld%ld长整型,l 表示 "long"。
long long int%lld%lld更长的整型,ll 表示 "long long"。
unsigned int%u,必须用 %u%d 会错误解释二进制表示(负数问题)%u无符号十进制整数。
unsigned short%hu%hu无符号短整型。
unsigned long%lu%lu无符号长整型。
unsigned long long%llu%llu无符号更长的整型。
float%f 或 %e/%E%f%f 以小数形式输出,%e/%E 以科学计数法输出。scanf 只用 %f
double%lf 或 %le/%lE%lfprintf 中 %f 和 %lf 都行(C99起),但 scanf 必须用 %lf
long double%Lf 或 %Le/%LE%LfL 表示 "long double"。
char%c%c单个字符。
char* (字符串)%s%s字符串(scanf 需确保缓冲区足够大)。
void* (指针)%p%p以十六进制输出指针地址。

总结

  • 可以勉强用 %d(但不推荐):

    • short int(建议用 %hd

    • 32位系统下的 long int(建议用 %ld

  • 绝对不能用 %d

    • long long int(用 %lld

    • 所有 unsigned 类型(用 %u%hu%lu%llu

 

注意事项:

float 和 double 在 printf 中的区别

  • C99 标准后,printf 中 %f 和 %lf 对于 double 是等价的,但传统上 %f 更常见
  • scanf 中必须严格区分:float 用 %fdouble 用 %lf
  • 科学计数法%e/%E(小写/大写指数符号),例如 3.14e+00 或 3.14E+00

long double 的特殊性:必须使用 %Lf%Le 等(大写 L)。

char 的输入输出scanf 用 %c 时可能读取空白字符(如空格、换行),若需跳过空白,可用 " %c"(前面加空格)。

安全性scanf 读取字符串 (%s) 时存在缓冲区溢出风险,建议使用 %ns(如 %10s)指定最大长度。

sizeof操作符

sizeof 是⼀个关键字,也是操作符,单位是 :字节,用于计算数据类型或对象在内存中所占的字节数。

长度参考:https://zh.cppreference.com/w/c/language/arithmetic_types#.E6.95.B0.E6.8D.AE.E6.A8.A1.E5.9E.8Bhttps://zh.cppreference.com/w/c/language/arithmetic_types#.E6.95.B0.E6.8D.AE.E6.A8.A1.E5.9E.8B

功能:

1.计算数据类型的大小:返回指定数据类型所占的字节数

printf("int size: %zu\n", sizeof(int));  // 通常输出4(32位系统)

2.计算变量的大小:返回变量所占的字节数

double d;
printf("double size: %zu\n", sizeof d);  // 通常输出8

3.计算数组的大小:返回整个数组的字节数

int arr[10];
printf("array size: %zu\n", sizeof(arr));  // 输出40(假设int为4字节)

重要特性

  1. 编译时求值sizeof 在编译时就能确定结果,不会在运行时计算

  2. 返回类型:返回 size_t 类型(无符号整数类型),打印时应使用(优先使用 ) %zu 格式说明符

  3. 不需要括号的情况:当操作数是变量名时,括号可以省略(但通常建议保留)

动态内存分配

int *ptr = malloc(10 * sizeof(int));

数组元素个数计算

int arr[] = {1, 2, 3, 4, 5};
size_t n = sizeof(arr) / sizeof(arr[0]);  // 计算数组元素个数

结构体大小计算

struct example {
    char c;
    int i;
    double d;
};
printf("struct size: %zu\n", sizeof(struct example));

 

注意事项

  1. 指针大小sizeof 对指针返回的是指针本身的大小,而不是它指向的数据大小

int *p;
printf("pointer size: %zu\n", sizeof(p));  // 通常4或8字节

 2.字符串字面量:计算字符串字面量时包括终止的空字符

printf("%zu\n", sizeof("hello"));  // 输出6(5个字符+'\0')

3.结构体填充:结构体大小可能因对齐填充而大于成员大小之和

signed 有符号(正数/负数/0)

例:signed int a;// 等同于 int a;

unsigned 无符号(只能表示0和正数)

例:unsigned int a;

字符类型 char 也可以设置 signed 和 unsigned 。

signed char c; // 范围为 -128 到 127

unsigned char c; // 范围为 0 到 255

注意,C语⾔规定 char 类型默认是否带有正负号,由当前系统决定。 这就是说, char 不等同于 unsigned char 。,它有可能是 signed char  ,也有可能是unsigned char,这⼀点与 int 不同,  int 就是等同于 signed int 。

Everything查找

limits.h ⽂件中说明了整型类型的取值范围。

float.h 这个头⽂件中说明浮点型类型的取值范围

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值