初识C语言
目录
1.选择C语言的理由
1)自项向下、结构化编程和模块化设计
2)高效性
3)可移植性
2.CPU(中央处理器)
由运算单元ALU、控制单元CU、寄存器组(PC、IR、PSW、DR、通用寄存器等)通过内部总线连接,与外部与系统总线相连。
系统总线:控制总线CB、数据总线DB、地址总线AB。
运算器ALU:在控制器下完成算术和逻辑运算。
数据寄存器DR:暂存ALU的运算结果。
指令寄存器IR:保存当前正在执行的一条指令。当执行一条指令时,先把指令从指令cache存储器(指存)读出,再送到IR中。
程序计数器PC:存储下一条要执行的指令地址。
累加寄存器AC:为ALU提供一个工作区,用来暂存数据。
地址寄存器AR:保存当前CPU访问的内存单元的地址。
3.C语言的编译
c语言编译的整个流程是:源程序,预处理,编译,汇编,链接,可执行文件。
预处理用于将所有的#头文件以及宏定义替换成文件的真正内容,预处理之后得到的仍然是文本文件,但文件体积会大很多。
编译指将经过预处理之后的程序转换成特定汇编代码的过程。
汇编过程将上一步的汇编代码转换成机器码,产生目标文件(.obj)。
链接过程将多个目标文件、启动文件以及所需的库文件合并成一个文件,链接成最终的可执行文件(.exe)。
注:目标文件和可执行文件都由机器语言指令组成。
4.程序的输出在屏幕上一闪而过
某些窗口环境会在单独的窗口运行程序,然后在程序运行结束后自动关闭窗口。
解决方法:getchar();
这行代码会让程序等待击键,窗口会在用户按下一个键后才关闭。
int main()
{
float weight;
printf("输入你的体重:");
scanf("%f",&weight);
printf("你的体重:");
return 0;
}
即使加了一行getchar(),屏幕依旧一闪而过。这时需要调用两次getchar()函数:
getchar();
getchar();
getchar()函数读取下一个输入字符,因此程序会等待用户输入。在这种情况下,键入数字后按下enter,实际发送了一个换行符,然后scanf()读取键入的数字。
第一个getchar()读取换行符,第二个getchar()让程序暂停,等待输入。
5.C语言小贴示
#include<stdio.h>的作用就是相当于把stdio.h文件中的所有内容都输入到该行所在的位置。所有的C编译器软件包都提供stdio.h文件。
C程序一定从main()函数开始执行。return语句是一种跳转语句。
变量命名只能由大小写字母、数字和下划线组成。开头不能以数字开头。
变量声明时分配存储空间。
void a(void); //函数原型,函数声明
int main()
{
a(); //函数调用
}
void a(void) //函数定义
{
语句;
}
6.变量或函数命名规则
1)只能由大小写字母、数字和下划线组成。
2)不能以数字开头。
函数可以采用驼峰命名法。
7.位、字节和字的区别
位(bit)是最小的存储单元,可以存储0或1。
字节(byte)是常用的计算机存储单位,几乎对于所有的机器,1字节均为8位、
字(word)是设计计算机时给定的自然存储单位。比如,对于8位的微型计算机,1字长只有8位。字长越大,数据转移就越快,允许的内存访问也更多。
8.浮点数异于整形数
主要是储存方案不同。计算机把浮点数分成小数部分和指数部分,而且分开储存这两部分。
浮点数一般采取e计数法。比如3.16E7=3.16*10^7,2e-8=2*10^-8。
9.八进制和十六进制
十进制:%d
八进制:%o
十六进制:%x
也可
八进制:%#o
十六进制:%#x、%#X
int main()
{
int x=100;
printf("dec=%d ; octal=%o ; hex=%x\n",x,x,x);
printf("dec=%d ; octal=%#o ; hex=%#x\n",x,x,x);
return 0;
}
显示
dec=100 ; octal=144 ; hex=64
dec=100 ; octal=0144 ; hex=0x64
10.printf()输出打印
//常规输出
printf("x = %d",a);
//限定字符位输出,a输出2个字符位,默认靠右对齐
printf("x = %2d",a);
//限定字符位输出,a输出2个字符位,靠左对齐
printf("x = %-2d",a);
//限定字符位输出,a输出2个字符位,自动补0
printf("x = %02d",a);
//解释一下,加入a输出个位数,则在个位数前加个0
//如a=1,则输出x = 01
11.其他数据类型
打印unsigned int类型的值,使用%u转换说明;
打印long类型的值,使用%ld转换说明;如果系统的int和long大小相同,使用%d就行。
最大的short类型整数小于或等于最大的int类型整数。
最大的long类型整数大于或等于最大的int类型整数。
最大的long long类型整数大于或等于最大的long类型整数。
int类型的宽度要么和short类型相同,要么和long类型相同。
sizeof是C语言的内置运算符,以字节为单位给出指定类型的大小。%zd转换说明匹配sizeof的返回类型。
12.可移植类型:stdint.h和inttypes.h
C语言为现有类型创建了更多类型名,这些新的类型名定义在stdint.h头文件中。
为什么有这个函数的出现呢?比如针对不同计算机的int可能是16位、32位或64位。但int32_t一定是32位的有符号整数类型。
例如,int为16位、long为32位的系统会把int32_t作为long的别名。然后,使用int32_t类型编写程序,并包含stdint.h头文件时,编译器会把int或long替换与当前系统匹配的类型。
这种类型别名称为精确宽度整数类型。计算机底层系统可能不支持。
还有一种类型别名是最小宽度类型,在inttypes.h中体现。
例如,inttypes.h中头文件中定义了PRId32字符串宏,代表打印32位有符号值得合适转换说明(如d或l)。
#include<stdio.h>
#include<inttypes.h>
int main()
{
int32_t me32=45933945;
printf("me32=%" PRId32 "\n",me32);
return 0;
}
上面代码中,PRId32可以替换成"d"。
printf("me32=%" PRId32 "\n",me32);
printf("me32=%" "d" "\n",me32);
在C语言中,可以把多个连续的字符串组合成一个字符串。上行等效于下行。
printf("me32=%d \n",me32);
13.浮点数的上溢和下溢
浮点数产生上溢时,会赋值给该浮点数变量一个表示无穷大的特定值,打印输出该值为inf或infinity等。
浮点数产生下溢时,会丢失本身末尾有效位上的数值。
14.const关键字
const关键字,用于限定一个变量为只读。
例如:
const double TI=3852.99;
printf(“*%e*\n”,TI); //*3.852990e+03*
printf(“*%3.1f*\n”,TI); //*3853.0*
printf(“*%+4.2f*\n”,TI); //*+3852.99*
printf(“*%010.2*\n”,TI); //*0003852.99*
其他:
printf(“%x %X %#x\n”,31,31,31); //1f 1F 0x1f
printf(“**%d**% d**% d**\n”,42,42,-42); //**42** 42**-42**
printf(“**%5d**%5.3d**%05d**%05.3d**\n”,6,6,6,6); //** 6** 006**00006** 006**
再如:
#define PRO “I am superhero.”
printf(“[%10.3s]\n”,PRO); //[ I a]
printf(“[%-10.3s]\n”,PRO); //[I a ]
15.等价交换
for(;test;)和while(test)等价。
ch=getchar();
while(ch != ‘\n’)
{
...
ch=getchar();
}
//等同于
While( (ch=getchar()) != ‘\n’ )
{
...
}
16.ctype.h
函数名 | 如果是下列参数时,返回值为真 |
Isalnum() | 字母或数字 |
Isalpha() | 字母 |
Isblank() | 标准的空白字符(空格、水平制表符或换行符) |
Isdigit() | 数字 |
Isgraph() | 除空格之外的任意可打印字符 |
Islower() | 小写字母 |
Isprint() | 可打印字母 |
Ispunct() | 标点字符(除空格或字母数字字符以外的任何可打印字符) |
Isspace() | 空白字符(空格、换行符、回车符、水平制表符或垂直制表符) |
Isupper() | 大写字母 |
Isxdigit() | 十六进制数字符 |
函数名 | 行为 |
tolower() | 如果参数是大写字符,该函数返回小写字符;否则,返回原始参数 |
toupper() | 如果参数是小写字符,该函数返回大写字符;否则,返回原始参数 |