C语言基础
这是我的入门语言,自己学得不是很好,也用的不多
基础
1 |
|
在程序里可以用{}写调试代码,定义变量不会影响外面的变量c99
你的输入和你的程序中间还有一个shell
标识符
- 由字母和下划线,数字组成,但数字不能开头
- 且不能用
C关键字 - 区分大小写,长度不限
变量
变量定义格式为:
类型 变量名=value;
- 每结束一个变量必须以;结尾
- 变量说明必须放在函数开头部分
- 通过
=赋值;
常量
宏定义:#define 常量名 数据
函数内定义:
const 类型 类型名;
说明:const只有c99才支持
整型数据
整型常量
也叫常数,常见的有十进制,八进制(前缀0),16进制(前缀0x)
整型变量
可以使用int创建一个存储整数的空间
- 所占字节数要看寄存器的大小,
- 有范围
- 类型有
int,short,long,unsigned,区分有符号的和无符号的 - 通过,可同时编译多个变量
sizeof()可以知道某变量所占字节大小;
sizeof()是静态运算符,他的结果在编译时就决定了,不能在()里做运算。
整形存储的二进制
十进制的正整数在内部就是他的二进制
而负数则采用补码的形式:
-a,补码2n-a,n为类型的位数
优点:方便计算,而不用判断正负
1111 1111用纯二进制代表255,补码代表-1
https://blog.csdn.net/qq_41739364/article/details/100125337
- 设计
unsigned的初衷是为了移位
16进制的一个位==2进制的4个位
8进制的一个位==2进制的3个位
实型数据(浮点型)
实型常量
- 也叫
实数或者浮点数 - 在c中,实数只采用十进制,有0-9和小数点组成
- 指数形式需要加e或E以及阶码组成
如2.6e-5
实型变量
- 分为两类,单精度
float(占4字节),双精度double(占8字节);
float
输入格式:%f
输出:%f
定义格式float a = 1.0f
如果不带
f则是double
double
输入:%lf
输出:%f %lf
浮点数的精度
1.无法比较
2.永远不精确;
通常使用double
字符型数据
字符常量
- 由单引号括起的字符,
'a'; - 不能用双引号
- 常量只能是单个字符,区分字符串
- 可以是字符集中任意字符,但
'1'和1不一样 - 占用一个字节,实质为
ASCⅡ码,所以可以像整数那样去计算
字符变量(逃逸字符)
转义字符变量
- 是一种特殊的变量,不同于字符原有的意义,所以称转义
- 如
\n代表换行
特别是所有
ASCⅡ码(0-255)都可以用\ddd(1-3位的八进制)和\xhh(1-2位的十六进制)表示字符变量
- 类型说明符为
char(占1byte) - 因为只有一个字节,所以只能存放一个字符(
ASCⅡ)
- 类型说明符为
C语言允许把整型值(2/4/8)赋给字符变量,字符变量赋给整型值,因为整型值字节多,转为字符值时按低8位处理
字符串常量
由双引号括起的字符序列,
“china”可以含一个或多个字符
不能把字符串常量赋给字符变量
通常以
\0结尾,系统自动加上,所占字节为所有字节数+1C语言会自动把两个
“”“”的内容连接起来C没有字符串变量,要用字符数组来存放字符串变量
基本输入与输出
因为C本身没有输入输出语句,这是由C函数库提供的,函数库有大量具有独立功能的函数程序块,printf和scanf存储在stdio.h头文件中,使用时要在源程序中加上#include
输出
printf(格式控制,输出序列)
- 格式控制为双引号括着的字符串,包含格式说明
%和普通字符;int %dlong %ldfloat %fdouble %lfchar %c - 输出序列则是若干的数据变量,也可以是表达式
printf(“%3.2f”,)数据占3位(超过不限制),向右对齐,左边补空格,小数点可以有2位,-3表示向左对齐
字符输出putchar
- 只处理一个字符
输入
scanf(格式控制,地址表列)
赋值给地址表列(以&开头)
&右边必须是明确的变量
字符输入getchar
- 只处理一个字符
格式化的输入输出
printf% [flags][width][.prec][hIL]type
| Flag | 含义 | width 或 prec | 含义 | hIL(类型修饰) | 含义 |
|---|---|---|---|---|---|
| - | 左对齐 | number | 最小字符数 | hh | 单个字节 |
| + | 在前面放+或- | * | 下一个参数是字符数 | h | short |
| (space) | 正数留空 | .number | 小数点后面的位数 | l | long |
| 0 | 0填充 | .* | 下一个参数是小数点后面的位数 | ll | long long |
| L | long double |
| type | 用于 | type | 用于 |
|---|---|---|---|
| i 或 d | int | g | float |
| u | unsigned int | G | float |
| o | 八进制 | a 或 A | 十六进制浮点 |
| x | 十六进制 | c | char |
| X | 字母大写的十六进制 | s | 字符串 |
| f 或 F | float,6 | p | 指针 |
| e 或 E | 指数 | n | 读入/写出的个数 |
scanf%[flag]typpe
| flag | 含义 | flag | 含义 |
|---|---|---|---|
| * | 跳过 | l | long,double |
| 数字 | 最大字符数 | ll | long long |
| hh | char | L | long doble |
| h | short |
| type | 用于 | type | 用于 |
|---|---|---|---|
| d | int | a,e,f,g | float |
| i | 整数,可能是8进制或16进制 | c | char |
| u | unsigned int | s | 字符串 |
| o | 八进制 | […] | 所允许的字符 |
| x | 十六进制 | p | 指针 |
printf &scanf是由返回值的
- 读入的项目数
- 输出的字符数
赋值运算
运算法则
()→-→%*/→+-- 复合赋值
- 类型最好为
double - 表示简化赋值操作的代码
例如x=x+10表示为x+=10 +=告诉编译程序:x被赋值为x+10- 同
*=/=;-=;%= - 根式
sqrt() - 指针运算
pow(2,4)表示2的4次方;可以用来表示多次根式; exp(3)表示e的三次方- 对数
log()
自增和自减(只适用于变量)
x=x+1可写成x++或者++x
当是一个单独的程序语句时,符号在前面后面都没关系;but下面的情况特殊
y=x++表示现将x的值给y,x再加1
y=++x表示x先加1再赋给y
++--优先级最高吧
x++表示的值是x的值,运算表示x=x+1
++x表示的值是x+1的值,运算表示x=x+1
关系运算
关系运算有两种结果,是1否0
< < <= =
1.这四组优先级相同
2.比下两个优先级高
== 比较等于
= 不等于
- 关系运算符的优先级低于算数运算符
- 但他高于赋值运算符
- 有括号还是算括号
逻辑运算符
结果同样只有0和1||或&&与!非
1.优先级从上到下逐渐升
2.但||&&低于关系运算符,高于赋值运算符!;高于算数运算符;实测比增减量符低
- 计算同物理电路
- 逻辑表达式对比是否非0值
重要!!!
1 |
|
逗号运算符及逗号表达式
- 可以连接多个表达式
- 表达式1,表达式2
- 从左到右依次计算
- 优先级最低
- 以右边的表达式作为结果
1 |
|
运行结果是3
1 |
|
运行结果是4
注意:调用函数时圆括号的逗号是标点符号
条件运算符和条件关系式
是C语言唯一的三目运算符(需要3个数据和表达式构成的条件表达式)
一般形式
表达式1 ? 表达式2 : 表达式3意为如果表达式1成立,则为表达式2的值,否则是表达式3的值
结合方向从右向左
自动类型转换机制和强制类型转换
自动
在运算中若有多个类型则计算机会自动转化为范围最宽的,但如果有float会自动转化为double强制
格式(类型)表达式
1.优先级和+--相同,因为它是单目运算符(只有一个变量的运算符)
2.对于printf,任何小于int的类型都会转换成int,float会转换成double
3.但scanf不会
产生随机数列
用到srand,rand函数
在#include <stdlib>函数库里
使用rand创建种子,rand根据种子产生随机数;
1 | srand(time(0)); |
选择结构程序设计
表达式里只要=0出现就会退出循环体!!!emmm表达式使用 <= 会给自己贴标签
顺序结构
选择结构
1 | //if-else结构格式: |
- 退化形式
无else直接结束 - 可以嵌套使用,
else配对原则:与之前最近的if配对;包含多个语句分支时,用{}括起语句不容易出错
多分支结构
1 | if() |
switch实现多分支结构
1 | switch(表达式) |
- 若没有
break,则一直执行到default
个人理解
if-else和switch条件分支语句当输入的范围广时用
if-else,反之都行
循环结构
当型循环
表达式在循环体上面,不满足条件会直接跳出循环;
1 | while(表达式) |
直到型循环;
表达式在循环体下面,不满足条件也会先执行一次循环体
1 | do |
for循环
1 | for(表达式1,表达式2,表达式3) |
表达式2没有默认是1
运行步骤:
先运行表达式1,然后对表达式2求解,为真则进入循环体,再执行表达式3,退回上一步;
表达式可以缺失,但
;不能少.
break continue
break出现在循环体中会直接跳出循环
continue则会回到原来的循环体
针对内层循环
离开多重循环
1.接力break:
内层循环定义一个变量exit == 1
外面每层循环加上if ( exit ==1 ) break
2.goto out
out:
会直接跳到out:之后的地方
表达式里只要=0出现就会退出循环体!!!
循环结构的选择:
1.固定次数用for
2.无论如何都要运行一次用do while
3.其他用while