C语言学习(1)

C语言学习(1)

一、C语言基础

1. 学习方法

  多看+多敲+多思考总结

2. C语言历史   

  机器码: 01二进制去写代码,困难很大 10+11运算
  + ---》 01001
  汇编语言:用助记符替换掉机器码中的序列
  + ---》add
  B语言
  1972年: 设计unix系统而发明了C语言

3. C语言中变量类型及其使用   

  变量:用来存放各种类型的数据   商品的价格---》小数表示 4.0 3.5
  商品的数量---》整数
  商品的名称---》中文字符串或者英文字符串
  变量类型:int(整型) float(单精度浮点型) double(双精度浮点型) short(短整型) long(长整型)long long int(长长整型) char(字符类型) bool(类型) struct(结构体) union(联合体) enum(枚举) unsigned(无符号数)

  变量的使用:
  语法规则: 类型 变量名字;
  int ab123;
  float price; //英文单词,或者缩写
  float jiage; //最恶心的
  C语言命名规范:
    第一个:变量的名字中只能有字母,数字和下划线组成,并且首字母不能是数字 ab Ab ab78 a79 _abc 7mn(非法) a#b(非法) h@c(非法)
    第二个:命名的时候尽量通俗易懂,不要用汉语拼音,用英文单词缩写   

  (1)整型   

 

 

 

  大小: 4个字节,32位二进制,知道大小是为了防止使用的时候数据溢出了(超出取值范围了)
  存储:
  原码:一个整数原本的二进制编码
  比如: 8的二进制原码 1000(短除法求)
  反码:把原码依次取反
  原码:1101 --》反码0010
  补码:反码加1
  原码:1101 --》补码0010+1 --》0011
  正数在计算机中采用原码存放,并且最高位是符号位,0表示正数,1表示负数
  1010
  负数在计算机中采用补码存放 -88

 

 

 

  练习: 熟悉一下短除法,求各种进制

    -1的二进制是多少

 

 

 

  (2)浮点型   

  float占4个字节
  double占8个字节
  小数在计算机中是无法精准存储的
  比如: 12.5
  12.6

 

 

 

 

 

 

  (3)short

  2个字节
  long 32位系统4字节 64位系统8字节
  long long int 12字节


  (4)char

  存放单个字符的ASCII码值 占1个字节
  @ # $ % "a" "b" "c" "1" "6" 8 9 0
  美国人制定了ASCII码表,把字符编码成整数
  man ASCII命令可以查看ASCII码表
  "A" -->65
  "a" -->97
  "0" -->48
  char a="@"; //C语言规定字符必须用单引号括起来


  (5)布尔类型

  bool--》判断真假的,跟C语言的条件判断相配合

  注意: 添加#include <stdbool.h>
  只有两个值: true 真 false 假
  定义: bool a=true; //等价于 bool a=1;
  bool b=false; //等价于 bool b=0;


  (6)无符号数

  unsigned int a; //无符号数a,不区分正负,当成纯粹的数字来计算,最高位不是符号位了
  unsigned float b;
  unsigned char c;


练习:
第一题:
char b="b";
char c=b+5; //请问c是多少

 

#include <stdio.h>

int main()
{
    char b = "b";
    char c = b+5;
    printf("C的ASCII值为:%d
",c);
    printf("C的符号为:%c
",c);
    return 0;
}

 

结果如下:

 

 

 

第二题:
char a=389; 请问打印a的值是多少?? 为什么??
考察数据溢出之后计算机是如何处理的

#include <stdio.h>

int main()
{
    char b = 400;
    char c =300;
    printf("b的值为:%d
",b);
    printf("C的值为:%d
",c);
    return 0;
}

 

 

结果如下:

b的值为:-112
C的值为:44

 

原理:从结果来看,char类型的变量a存放的值溢出了,系统将溢出的值舍去,取得小于256的数值,判断是否大于127,大于的话先取反码,再补码即+1。

小于127的数即本身。

eg:389-256=133;取反码就是122,再补码即为-123;

eg:300-256=44;即为44。


第三题:
字符跟整数之间
的换算

#include <stdio.h>

int main()
{
    char a = "9";
    char b = "5";
    char c = 7;
    printf("The a is %d
",a-"0");
    printf("The b is %d
",b-48);
    printf("The c is %c
",c+"0");
    return 0;
}

 

 

结果如下:

The a is 9
The b is 5
The c is 7

 

 

"9" -->转换成整数 9

"9"-"0" 或者 "9"-48 结果就是整数9
整数9 -->转换成字符"9"
9+"0" 或者9+48 结果是57

 

二、C语言程序的结构
1. 最简单的C语言程序

#include <stdio.h> //头文件

int main() //C语言程序的入口,main函数
{
    printf("hello world!
"); //帮助我们在屏幕上打印一句话
    return 0; //结束整个main函数
}

 


2. linux中编译C语言程序
gcc hello.c -o hello
gcc --》linux中编译器的名字
-o --》 output 输出
3. linux中执行C语言程序
./程序的名字

 

三、C语言的格式控制符号以及输入和输出

1. 格式控制符号

作用:由于C语言区分不同的数据类型,在输入输出这些数据的时候需要使用不同的格式控制符号来跟变量类型对应
  八进制数的标准写法:
  int a=10; 二进制10 --》2
  八进制10 --》8
  十六进制10 --》16
  // int a=b10; //二进制
  int a=010; //八进制10
  int a=0x10; //十六进制10
  int a=10; //十进制的
  对应关系:
  %d --> int
  %f -->float 默认保留6位有效数字
  %lf -->double
  %hu -->short
  %ld -->long
  %lld -->long long int
  %c -->char 输出的是字符本身
  %d -->char 输出是字符的ASCII码值
  %x -->十六进制,字符小写打印
  %X -->十六进制,字符大写打印
  %#x -->标准形式打印十六进制,前面加上0x
  %o -->八进制
  %#o -->标准形式打印八进制,前面加上0
  %10.2f -->前面10表示位宽不够左边补空格   后面的2表示保留2个小数位
  %-10.2f -->前面10表示位宽 后面的2表示保留2个小数位
  %.9f --》指定了保留9个小数位,位宽没有指定,默认位宽
  %10d -->10是位宽,靠右对齐,左边补空格
  %-10d --> 靠左对齐,右边补空格
  %s -->字符串
  %5s
  %p -->变量地址

 例如:

#include <stdio.h>
#include <stdbool.h>
int main()
{
    int a=199;
    float b=96.5;
     double c=89.3;
    short d=45;
      long e=125;
    long long int f=8934;
    char g="@";
    bool h=true;

    printf("a is:%d
",a);
    printf("a is:%x
",a);
    printf("a is:%X
",a);
    printf("a is:%#x
",a);
    printf("b is:%f
",b);
    printf("c is:%lf
",c);
    printf("d is:%hu
",d);
    printf("e is:%ld
",e);
    printf("f is:%lld
",f);
    printf("g is:%c
",g);
    printf("g is:%d
",g);
    return 0;
}

结果如下:

a is:199
a is:c7
a is:C7
a is:0xc7
b is:96.500000
c is:89.300000
d is:45
e is:125
f is:8934
g is:@
g is:64

 

例如:

#include <stdio.h>  
/*
这是一个例子程序,讲解代码书写规范
这个例子很重要,大家 养成好的习惯
  //块注释中不能嵌套块注释,但是可以嵌套单行注释
*/
int main()
{
    int a=0b1010; //定义了整型变量,给它赋值一个二进制数
    float b=15.6;
    double c=8933.3;
    char  d="o";
    
    printf("a is:%10d
",a);
    printf("a is:%-10d
",a);//-10d表示位宽,靠左对齐!
    
    printf("b is:%f
",b);     //b is:15.600000
    //小数点前面数字表示位宽(整个数字占用多少位置)
    printf("b is:%10.7f
",b); //b is:15.6000004
    printf("b is:%18.7f
",b); //b is:  15.6000004
    printf("b is:%18.3f
",b);
    printf("b is:%3.7f
",b);  //位宽不能小于这个数据本身的位宽
}

 

结果如下:

a is:        10
a is:10
b is:15.600000
b is:15.6000004
b is:        15.6000004
b is:            15.600
b is:15.6000004

 

作业:

2  8  10  16进制之间的相互转换

          二进制--》转换八进制

          二进制--》转换16进制

 

进制之间的转换规则

        二进制--》八进制

        二进制--》十六进制

            每个二进制为一组换算成对应的八进制即可

            每个二进制为一组换算成对应的十六进制即可

            八进制取值范围:0---7   最大的数字7换成二进制111  (421码)

            十六进制取值范围:0---F  最大的数字15换成二进制1111  (8421码)

 

        八进制--》二进制

              每个八进制位换算成三个二进制即可

                      八进制 071 ---》 7 --》二进制111

                                                 1 --》二进制001   //不够三位的补零对齐

                             071--》二进制111 001

        十六进制--》二进制

              每个十六进制位换算成四个二进制即可

                      十六进制 0A3---》 A --》二进制1010

                                                    3 --》二进制0011  //不够四位的补零对齐

                             0A3--》二进制1010 0011

        八进制--》十六进制

              思路:先把八进制转成2进制,然后再把2进制转成16进制即可

             八进制   0745 --》二进制111 100 101 --》16进制0001    1110     0101

                                                                                            1           E          5