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的第一次出现的位置

作用域规则

在函数内,如果局部变量和全局变量名字相同,会使用局部变量值

局部变量被定义时,必须对其初始化

posted @ 2025-04-08 21:40  myrrrr  阅读(34)  评论(0)    收藏  举报