C语言基础

这是我的入门语言,自己学得不是很好,也用的不多

基础

1
2
3
4
5
6
7
8
#include"stdio.h"//函数库
int main ()//圆括号里为参数,main前面为类型,为main返回值类型 ,大括号是函数体
{
char mychar='a';
putchar(mychar);
mychar=getchar();
return 0;
}

在程序里可以用{}写调试代码,定义变量不会影响外面的变量c99

你的输入和你的程序中间还有一个shell

标识符

  • 由字母和下划线,数字组成,但数字不能开头
  • 且不能用C关键字
  • 区分大小写,长度不限

变量

变量定义格式为:
类型 变量名=value

  • 每结束一个变量必须以;结尾
  • 变量说明必须放在函数开头部分
  • 通过=赋值;

常量

宏定义:
#define 常量名 数据

函数内定义:
const 类型 类型名;

说明:const只有c99才支持

整型数据

整型常量

也叫常数,常见的有十进制,八进制(前缀0),16进制(前缀0x

整型变量

可以使用int创建一个存储整数的空间

  • 所占字节数要看寄存器的大小,
  • 有范围
  • 类型有intshortlongunsigned,区分有符号的和无符号的
  • 通过,可同时编译多个变量
  • sizeof()可以知道某变量所占字节大小;

sizeof()是静态运算符,他的结果在编译时就决定了,不能在()里做运算。

整形存储的二进制

  • 十进制的正整数在内部就是他的二进制

  • 而负数则采用补码的形式:

    • -a,补码2n-an为类型的位数
  • 优点:方便计算,而不用判断正负

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结尾,系统自动加上,所占字节为所有字节数+1

  • C语言会自动把两个“”“”的内容连接起来

  • C没有字符串变量,要用字符数组来存放字符串变量

基本输入与输出

因为C本身没有输入输出语句,这是由C函数库提供的,函数库有大量具有独立功能的函数程序块,printfscanf存储在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.比下两个优先级高

== 比较等于
= 不等于

  1. 关系运算符的优先级低于算数运算符
  2. 但他高于赋值运算符
  3. 有括号还是算括号

逻辑运算符

结果同样只有0和1
||
&&
!
1.优先级从上到下逐渐升
2.但||&&低于关系运算符,高于赋值运算符!;高于算数运算符;实测比增减量符低

  • 计算同物理电路
  • 逻辑表达式对比是否非0值

重要!!!

1
2
3
4
5
6
7
#include<stdio.h>
main(){
int a=1,b=2,c=3,d=4,m=2,n=2;
(m=a>b)&&(n=c>d);//m=0,因为是与运算,所以后面不看了,n=2
printf("%d",n);
system("pause");
}

逗号运算符及逗号表达式

  • 可以连接多个表达式
  • 表达式1,表达式2
  • 从左到右依次计算
  • 优先级最低
  • 以右边的表达式作为结果
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

int main () {

int i;

i = 3, 4;

printf("%d\n", i);

}

运行结果是3

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

int main () {

int i;

i = (3, 4);

printf("%d\n", i);

}

运行结果是4

注意:调用函数时圆括号的逗号是标点符号

条件运算符和条件关系式

  • 是C语言唯一的三目运算符(需要3个数据和表达式构成的条件表达式)

    一般形式

    表达式1 ? 表达式2 : 表达式3

    • 意为如果表达式1成立,则为表达式2的值,否则是表达式3的值

    • 结合方向从右向左

自动类型转换机制和强制类型转换

  • 自动
    在运算中若有多个类型则计算机会自动转化为范围最宽的,但如果有float会自动转化为double

  • 强制
    格式
    (类型)表达式

1.优先级和+--相同,因为它是单目运算符(只有一个变量的运算符)

2.对于printf,任何小于int的类型都会转换成intfloat会转换成double

3.但scanf不会

产生随机数列

用到srand,rand函数
#include <stdlib>函数库里
使用rand创建种子,rand根据种子产生随机数;

1
2
srand(time(0));
rand()1000//产生1000以内的随机数;

选择结构程序设计

表达式里只要=0出现就会退出循环体!!!
emmm表达式使用 <= 会给自己贴标签

顺序结构

选择结构

1
2
3
4
5
//if-else结构格式:
if(表达式)
{ }
else
{ }
  • 退化形式
    else直接结束
  • 可以嵌套使用,else配对原则:与之前最近的if配对;包含多个语句分支时,用{}括起语句不容易出错
    多分支结构
1
2
3
4
5
6
7
if()
{ }
else if()
{ }
.....
else
{ }

switch实现多分支结构

1
2
3
4
5
6
7
switch(表达式)
{
case 常量表达式1:语句块1;break;
case
.....
default:语句块;
}
  • 若没有break,则一直执行到default

个人理解if-elseswitch条件分支语句

当输入的范围广时用if-else,反之都行

循环结构

当型循环

表达式在循环体上面,不满足条件会直接跳出循环;

1
2
3
4
while(表达式)
{
循环体;
}

直到型循环;

表达式在循环体下面,不满足条件也会先执行一次循环体

1
2
3
4
5
do
{
循环体;
}
while(表达式);

for循环

1
2
3
4
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

作者

manu

发布于

2019-11-01

更新于

2023-01-06

许可协议


:D 一言句子获取中...