c语言笔记(2)
编译和链接
预编译--编译--汇编--链接----运行
编译:将c语言代码转化为汇编语言
汇编:生成目标文件或机器指令,形成符号表
链接:生成的目标文件通过链接器接在一起,生产可执行的程序
格式化输出
%d/%i:输出十进制整数
%u:输出无符号十进制整数
%f:输出浮点数
%s:输出字符串
%c:输出字符
%p:输出指针
%x/X:输出十六进制数(小写字母/大写字母)
%o:输出八进制数
%e/E:输出科学计数法表示的浮点数
%g/G:输出浮点数,没有无意义的0
分隔符
,分隔变量声明或函数参数
;结束语句
( ) 分组表达式、函数调用
{ } 定义代码块
[ ] 数组下标
注释
// 单行注释 / 单行或多行注释
不能再注释内嵌套注释,注释也不能出现在字符串或字符值中
类型转换
隐式类型转换:无需命令或函数调用,通常将较小的类型自动转换为较大的类型
显式类型转换:需要使用强制类型转换运算符,可将一个数据类型的值转换为另一种数据类型的值
转义序列码
\a 警报铃声
\b 退格键
\f 换页符
\n 换行符
\r 回车
\t 水平制表符(tab键效果)每8个字符可看作一个水平制表符
\v 垂直制表符 (从下一行输出,开始列数为前一个字符所在后一列)
定义常量
1.define 常量名 常量值
2.const 数据类型 常量名 = 常量值
define仅进行简单的文本替换 不进行类型检查 没有作用域限制 不会有相应的条目;const声明一个具有类型的常量 具有类型信息 块级作用域 有相应的条目 有助于调试和可读性
存储类
auto: 所有局部变量默认 只能用在函数内 修饰局部变量
register: 定义储存在寄存器中 不能直接取地址
static: 修饰局部变量可以在函数调用之间保持局部变量的值,不需要在每次进入和离开作用域时进行创建和销毁
extern:定义在其它文件中声明的全局变量或函数,提供一个全局变量的引用,对所有的程序文件都可见
输入输出
标准输入:stdin 键盘
标准输出:stdout 屏幕
标准错误:stderr 您的屏幕
scanf()函数从标准输入读取并格式化,printf()函数发送格式化输出到标准输出
int getchar(void) 函数 从屏幕上读取下一个可用的字符,并返回为一个整数
int putchar(int c)把字符输出到屏幕上,并返回相同的字符
gets() 从标准输入设备读取一行字符串,但容易导致缓冲区溢出,推荐使用fgets()
char *fgets(char *str,int n,FILE *stream);/fgets(str,sizeof(str),stdin);
str:存储读取的字符串 ; n:要读取的最大字符数(包括空字符\0) ; stream:文件流,通常使用stdin表示标准输入;sizeof(str)为数组大小
可以读取包含空格的字符串;自动将换行符替换为‘\0’
puts() 将一个字符串输出到标准输出设备,并自动在末尾添加换行符
int puts(const char *str);
成功时返回非负值,失败是返回EOF 只需要一个字符串参数
fputs()将字符串输出到指定的流,但不会自动在字符串末尾添加换行符
int fputs(const char *str,FILE *stream);
特点:1.不添加换行符;2.可以输出到任意流
fopen()打开一个文件
FILE *fopen(const char *filename,const char *mode);
mode:打开文件的模式
成功时返回指向FILE对象的指针,失败时返回NULL
fclose()关闭一个可打开的文件
int fclose(FILE *stream);
stream: 指向FILE对象的指针
成功时返回0,失败时返回EOF
变量输入
scanf("%d,&num")
遇到空白符停止读取;不自动在末尾添加换行符
字符串输入
scanf("%s,str")
getch和getchar的区别:getch直接从键盘获得取键值
getch和_getch的区别:__getch更简单可靠
运算符
二目运算符 + - * / 三目运算符:?:(唯一)
三目运算:a>b?a:b
Exp1?Exp2:Exp3 如果Exp1为真,Exp2的值为表达式的值;Exp1为假,则Exp3的值为表达式的值
逻辑非!(!0→1)(!非零→0)
i++ 先返回变量当前值,然后变量+1;++i 变量先加1,再返回新值
& (与运算)只要一个为0就停止运算 ;|(或运算)只要一个为1就停止运算 ;^ (异或) 相同则0 不同则1 ; ~ (取反)
优先级
算术运算符 > 关系预算符 > 逻辑运算符(逻辑非!除外) > 赋值运算符
从右到左:单目运算符 三目运算符 赋值运算符
程序的语句
什么情况下用int main(int argc,char *argv[ ]):需要程序带参数地启动的时候,而不是运行过程中敲入东西给程序
头文件
<stdio.h> 标准输入输出库
<stdlib.h> 标准库函数
<string.h> 字符串操作函数
<ctype.h> 字符处理函数
循环
while循环:给定条件为真时,重复语句或语句组。在执行循环主体之前测试条件
do while循环:在循环主体结尾测试条件,其余和while循环一样
break: 终止循环或switch语句,程序继续执行循环
continue: 停止本次循环,重新开始下一次循环
return 结束整个函数;break 只结束了当前for循环,可以接着执行if函数
return 0 函数正常终止
数组
一组相同类型的变量连续的存储在一段内存,并共用一个名字
数组的下标从0开始
数组类型:数值数组,字符数组,指针数组,结构数组等
一维数组的定义形式: 数据类型(数组元素类型) 数组名[常量表达式](数组长度)eg:int a[10]
strlen是用来计算字符串中非'\0'的字符个数
数组只能在初始化的时候赋值 ; 数组名是常量指针,一旦定义不能修改
二维数组:数组名[常量表达式1][常量表达式2] eg:int a[5][10]
二维数组按行排列
c语言中,当数组作为函数参数传递时,会退化为指针,int a[] = int *a
字符串
由零个或多个字符组成的有限序列 可以定义问"C1C2C3C4..Cn\0" (字符串以\0结尾)
若双引号本身是字符串中的一个字符 : 在引号前加一个\
常见转义字符
\ddd 1-3位八进制数所代表的任意字符
\xhh 1-2位十六进制所代表的任意字符
char *s="0" char c='0' int i = 0 char c1 = '\0'
多字节字符串英文字符占1个字节,中文字符占2个字节 ; 宽字符串每个字符都占2个字节(包括结尾的\0)
可以调用wctomb()等函数将宽字符串与多字节串相互转换
字符串前面加L表示宽字符
fgets和gets_s区别: fgets能读取指定大小的数据,如果读到换行符会把它存储到字符串中,而gets函数会丢弃它
最后一个字符是'\0'的字符数组就是字符串
操作字符串的函数
strcpy(s1,s2) 复制字符串s2到s1
strcat(s1,s2) 连接字符串s2到s1
strlen(s1) 返回字符串s1的长度
strcmp(s1,s2) 如果s1 s2相同,返回0;s1<s2, 返回<0; s1>s2, 返回>0
strchr(s1,ch) 返回一个指针,指向字符串s1中字符ch的第一次出现的位置
strstr(s1,s2) 返回一个指针,指向字符串s1中字符串s2的第一次出现的位置
作用域规则
在函数内,如果局部变量和全局变量名字相同,会使用局部变量值
局部变量被定义时,必须对其初始化
浙公网安备 33010602011771号