一、文件类别
头文件:xxxx.h
源文件:xxxx.c xxxx.cpp
.c表示C的源程序
.cpp表示C++的源程序
二、第一个c语言程序
程序的运作
关于main函数
1.c语言是从主函数的第一行开始执行的
2.main函数一个项目中有且仅有一个
3.一个项目可以有多个.c文件
4.但是多个.c文件中只能有一个main函数
#include<stdio.h>
int main()
{
printf("Hello World!\n");
return 0;
}
//输入Ctrl+f5运行
\n为换行符
使用输出标准printf函数需要引用stdio.h头文件(放到开头)
头文件各种类型:
stdio.h 输入输出标准函数头文件
string.h 字符串操作函数头文件
math.h 数学函数头文件
alloc.h 动态分配地址函数头文件
graphics.h 图形函数头文件
conio.h 屏幕操作函数头文件
dos.h 与DOS接口的函数头文件
三、数据类型
主要类型
- char 字符数据类型(也属于整型)
- int 整型(字符操作函数大多返回int类型,由于EOF为-1,char无法接收)
- short 短整型
- long 长整型
- long long 更长的整型
- float 单精度浮点数(运算时精确至小数位)(如:float a = 9.0(会变成double类型)) (float a = 9.5f)
- double 双精度浮点数
(数据类型加上unsigned前缀可转为无符号类型eg:unsigned int b = 13,格式控制符为%u)
*无符号优先原则
注:有符号数与无符号数进行计算或是比较时,会全部转化为无符号数再进行补码计算。
eg(计算):
int x = -20;
unsigned int y = 10;
//会出现表达式( x + y > 0 )为真的情况
//这是由于 x + y 结果为无符号形式
eg(比较):
#include<stdio.h>
int i;
void main()
{
i--;
//此时i值对应-1
(i > sizeof(i)) ? printf(">") : printf("<");
//由于sizeof返回值为无符号整型,故i会先被转化为无符号整型再进行比较
}
主要的输出控制符
格式控制符 | 说明 |
%c | 输出一个单一的字符 |
%s | 输出一个字符串 |
%zd、%zx、%zo | 输出size_t类型 |
%hd、%d、%ld | 以十进制、有符号的形式输出 short、int、long 类型的整数 |
%hu、%u、%lu | 以十进制、无符号的形式输出 short、int、long 类型的整数 |
%ho、%o、%lo | 以八进制、不带前缀、无符号的形式输出 short、int、long 类型的整数 |
%#ho、%#o、%#lo | 以八进制、带前缀、无符号的形式输出 short、int、long 类型的整数 |
%hx、%x、%lx %hX、%X、%lX | 以十六进制、不带前缀、无符号的形式输出 short、int、long 类型的整数。如果 x 小写,那么输出的十六进制数字也小写;如果 X 大写,那么输出的十六进制数字也大写。 |
%#hx、%#x、%#lx %#hX、%#X、%#lX | 以十六进制、带前缀、无符号的形式输出 short、int、long 类型的整数。如果 x 小写,那么输出的十六进制数字和前缀都小写;如果 X 大写,那么输出的十六进制数字和前缀都大写。 |
%f、%lf | 以十进制的形式输出 float、double 类型的小数 |
%e、%le %E、%lE | 以指数的形式输出 float、double 类型的小数。如果 e 小写,那么输出结果中的 e 也小写;如果 E 大写,那么输出结果中的 E 也大写。 |
%g、%lg %G、%lG | 以十进制和指数中较短的形式输出 float、double 类型的小数,并且小数部分的最后不会添加多余的 0。如果 g 小写,那么当以指数形式输出时 e 也小写;如果 G 大写,那么当以指数形式输出时 E 也大写。 |
注:C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12A”时,A即为非法数据)时即认为该数据结束
*sizeof操作符(返回类型为无符号)
注:sizeof操作符中的表达式不进行运算,sizeof通过类型属性得到结果,不参与值的计算。
因此sizeof可以无视非法访问等的问题
解释:
表达式分为
1.值属性
2.类型属性
eg:
3 + 5: 值属性为8 ------类型属性为int
eg:
void main()
{
int a = 10;
printf("%d\n", sizeof(a++));
printf("%d\n", a);
}
//输出结果为4 10
//a++并未生效
sizeof-操作符-计算类型或者变量所占空间的大小
sizeof可以计算出每种类型所占的内存 其单位都为字节byte
通过上述性质sizeof可以计算出数组的元素个数
#include<stdio.h>
void main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int unit = sizeof(arr[0]);//计算一个元素的大小
int amounts = sizeof(arr);//计算整个数组的大小
int result = amounts / unit;//从而算出整个数组的元素
printf("%d", result);
}
注:
sizeof可以计算实参的数组总内存大小,但在main之外的函数由于数组形参传过来的是指针,所以此时用sizeof计算数组得出来的是指针变量的内存大小。
不同数据类型所占的内存
#include<stdio.h>
int main()
{
printf("%d\n",sizeof(char));
printf("%d\n", sizeof(short));
printf("%d\n", sizeof(int));
printf("%d\n", sizeof(long));
printf("%d\n", sizeof(long long));
printf("%d\n", sizeof(float));
printf("%d\n", sizeof(double));
return 0;
}
%d是指定的输出格式,d表示用“十进制整数”形式输出,在这里输出时用sizeof(xx)的值取代%d
%d-整型 %f-float %lf-double
计算机中识别二进制0和1都占1bit的内存
相关单位换算
1 byte=8 bit
1 kb= 1024byte
1 mb=1024 kb
1 gb = 1024 mb
......
由图中运行结果可知 int整型与long长整型所占内存一样
这是由于 C语言标准:
sizeof(long)>=sizeof(int)
*整型提升
char类型转int类型的整型提升(short类型同理)
char a = 3;
char b = 127;
char c = a + b;
printf("%d", c);
//输出结果为-126
进行加法运算时候,a与b会被整型提升
char类型为8bit,故:
a为0000 0011
b为0111 1111
整型提升根据符号位补1或0
a->0000 0000 0000 0000 0000 0000 0000 0011
b->0000 0000 0000 0000 0000 0000 0111 1111
a + b ->0000 0000 0000 0000 0000 0000 1000 0010
由于c还要转换为char类型,所以变为了1000 0010
1为符号位,所以成为了负数补码,求解后为-126