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 %d
long %ld
float %f
double %lf
char %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