首页 / C++ / 【C/C++】复合类型(自定义类型)
【C/C++】复合类型(自定义类型)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了【C/C++】复合类型(自定义类型),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含10712字,纯文字阅读大概需要16分钟。
内容图文
gcc编译器
gcc(GNU Compiler Collection,GNU 编译器套件),是由 GNU 开发的编程语言编译器。gcc原本作为GNU操作系统的官方编译器,现已被大多数类Unix操作系统(如Linux、BSD、Mac OS X等)采纳为标准的编译器,gcc同样适用于微软的Windows。
gcc最初用于编译C语言,随着项目的发展gcc已经成为了能够编译C、C++、Java、Ada、fortran、Object C、Object C++、Go语言的编译器大家族。
编译命令格式:
gcc [-option1] ... <filename>
g++ [-option1] ... <filename>
1
2
命令、选项和源文件之间使用空格分隔
一行命令中可以有零个、一个或多个选项
文件名可以包含文件的绝对路径,也可以使用相对路径
如果命令中不包含输出可执行文件的文件名,可执行文件的文件名会自动生成一个默认名,Linux平台为a.out,Windows平台为a.exe
gcc、g++编译常用选项说明:
选项 含义
-o file 指定生成的输出文件名为file
-E 只进行预处理
-S(大写) 只进行预处理和编译
-c(小写) 只进行预处理、编译和汇编
C语言是不跨平台的,用Java用习惯的我突然回到C,有点不适应,用SpringBoot完成的Java项目,打成jar包,只要安装了Java的环境,哪个地方都能跑。
对于C来说Linux编译后的可执行程序只能在Linux运行,Windows编译后的程序只能在Windows下运行。64位的Linux编译后的程序只能在64位Linux下运行,32位Linux编译后的程序只能在32位的Linux运行。
VS2019
这个是Windows环境下的工具。
用的是社区版,只装了C++的功能,快捷键用起来比较舒服,反编译还方便,学习了Java才知道有语法糖这个东西(Java的编译器帮我们做了很多的东西),这次重拾C/C++的时候,一定要摸清楚它们的编译器编译的时候做了哪些我们看不到,但是对我们来说很重要的事情
大二上学了一点汇编基础,要是有能力的话,后面看汇编也未尝不可。
C语言编译过程
C程序编译步骤
C代码编译成可执行程序经过4步:
1)预处理:宏定义展开、头文件展开、条件编译等,同时将代码中的注释删除,这里并不会检查语法
2)编译:检查语法,将预处理后文件编译生成汇编文件
3)汇编:将汇编文件生成目标文件(二进制文件)
4)链接:C语言写的程序是需要依赖各种库的,所以编译之后还需要把库链接到最终的可执行程序中去
这里用gcc展示一下编译过程
vim hello.c
1
分步编译
预处理:gcc -E hello.c -o hello.i http://trks.wikidot.com/
编 译:gcc -S hello.i -o hello.s
汇 编:gcc -c hello.s -o hello.o
链 接:gcc hello.o -o hello_elf
执行:
可以查看一下程序所依赖的动态库
.so结尾的都是库
libc是c的代码库,linux-gnu是Linux的标准协议,libc.so.6满足这个标准
下面的那个是Linux的平台库
选项 含义
-E 只进行预处理
-S (大写) 只进行预处理和编译
-c (小写) 只进行预处理、编译和汇编
-o file 指定生成的输出文件名为file
文件后缀 含义
.c C语言文件
.i 预处理后的C语言文件
.s 编译后的汇编文件
.o 编译后的目标文件
注意这里没有贴分步编译后的文件的内容,但是里面的内容很有价值一定要看一看。一定要联系前面C代码编译成可执行程序经过4步的文字描述
一步编译的情况也演示一下吧:
关于执行:
我们的程序文件存在于外存储器,要读到内存中进行执行,这个时候就涉及缓存和寄存器,CPU相关的东西了。计算机组成原理(或者说计算机系统)方面的知识就不多赘述,不然篇幅太长了。
C语言代码主体
必要内容
include头文件
#include< > 与 #include ""的区别:
< > 表示系统直接按系统指定的目录检索
“” 表示系统先在 “” 指定的路径(没写路径代表当前路径)查找头文件,如果找不到,再按系统指定的目录检索
main函数
一个完整的C语言程序,是由一个、且只能有一个main()函数(又称主函数,必须有)和若干个其他函数结合而成(可选)。
main函数是C语言程序的入口,程序是从main函数开始执行。
{} 括号,程序体和代码块
{}叫代码块,一个代码块内部可以有一条或者多条语句
C语言每句可执行代码都是";"分号结尾
所有的#开头的行,都代表预编译指令,预编译指令行结尾是没有分号的
所有的可执行语句必须是在代码块里面
注释
//叫行注释,注释的内容编译器是忽略的,注释主要的作用是在代码中加一些说明和解释,这样有利于代码的阅读
/* */叫块注释
块注释是C语言标准的注释方法
行注释是从C++语言借鉴过来的
return语句
return代表函数执行完毕,返回return代表函数的终止
如果main定义的时候前面是int,那么return后面就需要写一个整数;如果main定义的时候前面是void,那么return后面什么也不需要写
在main函数中return 0代表程序执行成功,return -1代表程序执行失败
int main()和void main()在C语言中是一样的,但C++只接受int main这种定义方式
C语言数据类型
关键字
C语言有32个关键字:
数据类型关键字
分类 名称 描述
基本数据类型 (5个) void 声明函数无返回值或无参数,声明无类型指针,显式丢弃运算结果。
. char
. int 整型数据,通常为编译器指定的机器字长。
. float 单精度浮点型数据,属于浮点数据的一种,小数点后保存6位。
. double 双精度浮点型数据,属于浮点数据的一种,比float保存的精度高,小数点后保存15/16位。
类型修饰关键字(4个) short 修饰int,短整型数据,可省略被修饰的int。
. long 修饰int,长整形数据,可省略被修饰的int。
. signed 修饰整型数据,有符号数据类型。
. unsigned 修饰整型数据,无符号数据类型。
复杂类型关键字(5个) struct 结构体声明
. union 共用体声明
. enum 枚举声明
. typedef 声明类型别名
. sizeof 得到特定类型或特定类型变量的大小。
存储级别关键字(6个) auto 指定为自动变量,由编译器自动分配及释放。通常在栈上分配。
. static 指定为静态变量,分配在静态变量区,修饰函数时,指定函数作用域为文件内部。
. register 指定为寄存器变量,建议编译器将变量存储到寄存器中使用,也可以修饰函数形参,建议编译器通过寄存器而不是堆栈传递参数。
. extern 指定对应变量为外部变量,即在另外的目标文件中定义,可以认为是约定由另外文件声明的。
. const 与volatile合称“cv特性”,指定变量不可被当前线程/进程改变(但有可能被系统或其他线程/进程改变)
. volatile 与const合称“cv特性”,指定变量的值有可能会被系统或其他进程/线程改变,强制编译器每次从内存中取得该变量的值
跳转结构(4个) return 用在函数体中,返回特定值(或者是void值,即不返回值)
. continue 结束当前循环,开始下一轮循环
. break 跳出当前循环或switch结构
. goto 无条件跳转语句。
分支结构(5个) if 条件语句
. else 条件语句否定分支(与if连用)
. switch 开关语句(多重分支语句)
. case 开关语句中的分支标记
. default
循环结构(3个)for for循环结构
. do do循环结构
. while
数据类型的作用:编译器预算对象(变量)分配的内存空间大小。
常量
常量:
在程序运行过程中,其值不能被改变的量
常量一般出现在表达式或赋值语句中
整型常量 100,200,-100,0
实型常量 3.14 , 0.125,-3.123
字符型常量 ‘a’,‘b’,‘1’,‘\n’
字符串常量 “a”,“ab”,“12356”
变量
变量:
在程序运行过程中,其值可以改变
变量在使用前必须先定义,定义变量前必须有相应的数据类型
标识符命名规则:
标识符不能是关键字
标识符只能由字母、数字、下划线组成
第一个字符必须为字母或下划线
标识符中字母区分大小写
变量特点:
变量在编译时为其分配相应的内存空间
可以通过其名字和地址访问相应内存
声明和定义区别
声明变量不需要建立存储空间,如:extern int a;
定义变量需要建立存储空间,如:int b;
#include <stdio.h> http://trks.wikidot.com/news
int main()
{
//extern 关键字只做声明,不能做任何定义
//声明一个变量a,a在这里没有建立存储空间
extern int a;
a = 10; //err, 没有空间,就不可以赋值
int b = 10; //定义一个变量b,b的类型为int,b赋值为10
return 0;
}
从广义的角度来讲声明中包含着定义,即定义是声明的一个特例,所以并非所有的声明都是定义:
int b 它既是声明,同时又是定义
对于 extern b来讲它只是声明不是定义
一般的情况下,把建立存储空间的声明称之为“定义”,而把不需要建立存储空间的声明称之为“声明”。
进制表示
C语言表示相应进制数:
进制 描述
十进制 以正常数字1-9开头,如123
八进制 以数字0开头,如0123
十六进制 以0x开头,如0x123
二进制 C语言不能直接书写二进制数
sizeof 关键字
sizeof不是函数,所以不需要包含任何头文件,它的功能是计算一个数据类型的大小,单位为字节
sizeof的返回值为size_t
size_t类型在32位操作系统下是unsigned int,是一个无符号的整数
int main()
{ http://trks.wikidot.com/article
int a;
int b = sizeof(a);//sizeof得到指定值占用内存的大小,单位:字节
printf("b = %d\n", b);
size_t c = sizeof(a);
printf("c = %u\n", c);//用无符号数的方式输出c的值
return 0;
}
整型:int
整型变量的定义和输出
打印格式 含义
%d 输出一个有符号的10进制int类型
%o(字母o) 输出8进制的int类型
%x 输出16进制的int类型,字母以小写输出
%X 输出16进制的int类型,字母以大写写输出
%u 输出一个10进制的无符号数
整型变量的输入
#include <stdio.h>
int main()
{
int a;
printf("请输入a的值:");
//不要加“\n”
scanf("%d", &a);
printf("a = %d\n", a); //打印a的值
return 0; http://iroz.wikidot.com/
}
short、int、long、long long
数据类型 占用空间
short(短整型) 2字节
int(整型) 4字节
long(长整形) Windows为4字节,Linux为4字节(32位),8字节(64位)
long long(长长整型) 8字节
注意:
需要注意的是,整型数据在内存中占的字节数与所选择的操作系统有关。虽然 C 语言标准中没有明确规定整型数据的长度,但 long 类型整数的长度不能短于 int 类型, short 类型整数的长度不能短于 int 类型。
当一个小的数据类型赋值给一个大的数据类型,不会出错,因为编译器会自动转化。但当一个大的类型赋值给一个小的数据类型,那么就可能丢失高位。
整型常量 所需类型
10 代表int类型
10l, 10L 代表long类型
10ll, 10LL 代表long long类型
10u, 10U 代表unsigned int类型
10ul, 10UL 代表unsigned long类型
10ull, 10ULL 代表unsigned long long类型
打印格式 含义
%hd 输出short类型
%d 输出int类型
%l 输出long类型
%ll 输出long long类型
%hu 输出unsigned short类型
%u 输出unsigned int类型
%lu 输出unsigned long类型
%llu 输出unsigned long long类型
有符号数和无符号数
有符号数
有符号数是最高位为符号位,0代表正数,1代表负数。
无符号数
无符号数最高位不是符号位,而就是数的一部分,无符号数不可能是负数。
当我们写程序要处理一个不可能出现负值的时候,一般用无符号数,这样可以增大数的表达最大值。
有符号和无符号整型取值范围
数据类型 占用空间 取值范围
short 2字节 -32768 到 32767
int 4字节 -2147483648 到 2147483647
long 4字节 -2147483648 到 2147483647
unsigned short 2字节 0 到 65535
unsigned int 4字节 0 到 4294967295
unsigned long 4字节 0 到 4294967295
字符型:char
字符型变量用于存储一个单一字符,在 C 语言中用 char 表示,其中每个字符变量都会占用 1 个字节。在给字符型变量赋值时,需要用一对英文半角格式的单引号(’ ')把字符括起来。
字符变量实际上并不是把该字符本身放到变量的内存单元中去,而是将该字符对应的 ASCII 编码放到变量的存储单元中。char的本质就是一个1字节大小的整型。
#include <stdio.h>
int main( http://iroz.wikidot.com/news )
{
char ch = 'a';
printf("sizeof(ch) = %u\n", sizeof(ch));
printf("ch[%%c] = %c\n", ch); //打印字符
printf("ch[%%d] = %d\n", ch); //打印‘a’ ASCII的值
char A = 'A';
char a = 'a';
printf("a = %d\n", a); //97
printf("A = %d\n", A); //65
printf("A = %c\n", 'a' - 32); //小写a转大写A
printf("a = %c\n", 'A' + 32); //大写A转小写a
ch = ' ';
printf("空字符:%d\n", ch); //空字符ASCII的值为32
printf("A = %c\n", 'a' - ' '); //小写a转大写A
printf("a = %c\n", 'A' + ' '); //大写A转小写a
return 0;
}
ASCII表
ASCII 码大致由以下两部分组成:
ASCII 非打印控制字符: ASCII 表上的数字 0-31 分配给了控制字符,用于控制像打印机等一些外围设备。
ASCII 打印字符:数字 32-126 分配给了能在键盘上找到的字符,当查看或打印文档时就会出现。数字 127 代表 Del 命令。
————————————————
原文链接:http://iroz.wikidot.com/article
内容总结
以上是互联网集市为您收集整理的【C/C++】复合类型(自定义类型)全部内容,希望文章能够帮你解决【C/C++】复合类型(自定义类型)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。