ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

C 语言-1 初识 C

2022-08-17 15:32:37  阅读:128  来源: 互联网

标签:字符 语言 输出 int 运算符 初识 printf 格式


1.1 C 的介绍

  • 发展:在 70 年代,由美国的一家公司的实验室正式发表了 C 语言,后来由美国制定了一个 C 语言标准,通常称之为 ANSI C

  • C 语言版本:

    • Microsoft C 或称 MS C
    • Borland Turbo C 或称 Turbo C
    • AT&T C
    • 这些C语言版本不仅实现了 ANSI C 标准,而且在此基础上各自作了一些扩充,使之更加方便
  • C 语言的特点:

    • 效率高:是一门编译型语言,不同于 JAVA、Python 的解释型语言,不需要通过解释器再被 CPU 识别,直接使用机器语言进行识别
    • 灵活度高
    • 可移植性高
    • C 语言允许直接访问物理地址,能进行位(bit)操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作
  • C & C++

    • 在 C 的基础上,一九八三年又该实验室又推出了 C++。进一步扩充和完善了 C语言,成为一种面向对象的程序设计语言
    • C++ 提出了一些更为深入的概念,C 是 C++的基础,C++语言和C语言在很多方面是兼容的
      • 要学 C++ 可以从 C 入门

1.2 入门 Hello C

  • 编写第一个 C 语言代码

    #include <stdio.h>
    int main(){
    	printf("Hello C!\n");
    	return 0;
    	}
    
    Hello C!
    

    include 命令:导入程序需要的源文件。这里是导入输出函数需要的源文件 stdio

    main 函数:main 是函数的函数名,表示这是一个主函数。每一个 C 程序都必须有,且只能有一个主函数(main 函数)

    printf:一种函数调用语句,功能是把要输出的内容送到显示器去显示

    return:用于定义返回值。这里返回的 0

  • 示例:

    #include<math.h>
    #include<stdio.h>
    main()			//主函数
    {
        double x,s;
        printf("input number:\n");
        scanf("%lf",&x);
        s=sin(x);
        printf("sine of %lf is %lf\n",x,s);
    }
    

    include 称为文件包含命令,扩展名为 .h 的文件称为头文件

    double x,s:定义两个实数变量,以被后面程序使用

    printf("input number:\n"):显示输出提示信息:input number

    scanf:从键盘获得一个实数 x

    s=sin(x):求 x 的正弦,并把它赋给变量 s

    printf("sine of %lf is %lf\n",x,s):显示程序运算结果

1.3 输入输出

  • C 语言中,所有的数据输入和输出都是由库函数完成,所谓的输入输出都是是以计算机为主体

    • 在使用 C 语言库时,要用预编译命令 #include,再将有关的“头文件”包含在源文件中

      #include<stdio.h> //或者 #include"stdio.h"
      
      • 头文件:被包含的文件通常是由系统提供的,其扩展名为 .h, 因此也称为头文件或首部文件
        • C语言的头文件中包括了各个标准库函数的函数原型
      • 标准输入输出的库函数要使用到“stdio.h”头文件(stdio 是 standard input &outupt 的缩写)
    • 系统允许printfscanf 函数这两个函数时可不加 #include< stdio.h >#include "stdio.h"

  • 格式输出函数—printf() 函数

    • printf() 函数称为格式输出函数,最末一个字母 f 为 format (格式)之意

    • 功能:按用户指定的格式,把指定的数据显示到显示器屏幕上

    • 一般语法格式:

      printf("格式控制字符串",输出表列);
      
      • 格式控制字符串:用于指定输出格式

        • 分类:可由格式字符串和非格式字符串两种组成
          • 格式字符串:以 % 开头的字符串,在 % 后面跟有各种格式字符,以说明输出数据的类型、形式、长度、小数、位数等,例如:%d 按照十进制整数进行输出;%c 按照字符型进行输出
          • 非格式字符串:在输出时原样照印,在显示中起提示作用
      • 输出表列:给出各个输出项,要求格式字符串和各输出项在数量和类型上一一对应

    • printf 的格式化控制字符详解:

      • 一般格式:

        %[标志][输出最小长度][.精度][长度]类型
        
      • 标志:

        标志 说明
        - 结果左对齐,右边填充空格
        输出符号(正号或者负号)
        “空格” 输出值为正时,以空格表示;输出值为负时,以负号表示
        # 对 c,s,d,u(一些”类型“,下面有简单讲解)类无影响;
        对 o 类,在输出时加前缀 o;
        对 x 类,在输出时加前缀 0x;
        对 e,g,f 类当结果有小数时才给出小数点
      • 最小输出长度:用十进制整数来表示输出的最少位数

        • 若实际位数多于定义的宽度,则按实际位数输出,若实际位数少于定义的宽度则补以空格或 0
      • 精度:精度格式符以 . 开头,后跟十进制整数

        • 如果输出数字,则表示小数的位数; 若实际位数大于所定义的精度数,则截去超过的部分
        • 如果输出的是字符,则表示输出字符的个数;
      • 长度:长度格式符为 h,l 两种,h 表示按短整型量输出,l 表示按长整型量输出

      • 类型:

        格式字符 说明
        d 以十进制形式输出带符号整数(正数不输出符号)
        o 以八进制形式输出无符号整数(不输出前缀 O)
        x,X 以十六进制形式输出无符号整数(不输出前缀Ox)
        u 以十进制形式输出无符号整数
        f 以小数形式输出单、双精度实数
        e,E 以指数形式输出单、双精度实数
        g,G 以 %f 或 %e 中较短的输出宽度输出单、双精度实数
        c 输出单个字符
        s 输出字符串
    • 示例 :多个 printf 与一个 printf 的区别
      多个 printf

      #include<stdio.h>
      int main(){
      	int i=2;
      	printf("%d\n",++i);
       	printf("%d\n",--i);
      	printf("%d\n",i++);
      	printf("%d\n",i--);
      	printf("%d\n",-i++);
      	printf("%d\n",-i--);
      }
      
      3
      2
      2
      3
      -2
      -3
      

      一个 printf

      #include<stdio.h>
      int main(){
      	int i=2;
      	printf("%d\n%d\n%d\n%d\n%d\n%d\n",++i,--i,i++,i--,-i++,-i--);
      }
      
      2
      2
      1
      2
      -1
      -2
      
      • 结果不同原因:因为 printf 函数对输出表中各量求值的顺序是自右至左进行。求值顺序虽是自右至左,但是输出顺序还是从左至右,因此得到的结果是上述输出结果
  • 格式输入函数—scanf() 函数

    • 功能:按用户指定的格式从键盘上把数据输入到指定的变量之中

    • 一般语法格式:

      scanf("格式控制字符串",地址表列);
      
      • 格式控制字符串:与 printf 函数的格式控制作用相同,但不能显示非格式字符串,也就是不能显示提示字符串

      • 地址表列:给出各变量的地址

        • 地址是由地址运算符“&”后跟变量名组成

          &a,&b
          

          分别表示变量 a 和变量 b 的地址

        • 变量的地址是 C 编译系统分配的,不必关心具体的地址是多少

    • 地址与变量名的关系

      赋值表达式 变量名 变量值 地址
      a=40 a 40 &a

      在赋值号左边是变量名,不能写地址,而 scanf 函数在本质上也是给变量赋值,但要求写变量的地址, 如 &a

    • scanf 的格式化字符详解:

      • 一般格式:

        %[*][输入数据宽度][长度]类型
        
      • “*” 符:表示该输入项,读入后不赋予相应的变量,即跳过该输入值

        scanf("%d,%*d,%d",&a,&b)
        

        当输入 1、2、3 时,将 1 赋予 a,2 被跳过,3 赋予 b

      • 宽度:用十进制整数指定输入的宽度(即字符数)

      • 长度:长度格式符为 l 和 h,l 表示输入长整型数据(如 %ld) 和双精度浮点数(如 %lf)。h 表示输入短整型数据

      • 类型:大致与 printf 的类型差不多,不做过多介绍

    • 注意:

      1. scanf 函数中没有精度控制

        scanf("%5.2f",&a); 	//这是非法的,不能用此语句输入小数为 2 位的实数
        
      2. 在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔则可用空格,TAB 或回车作间隔

        • C 编译在碰到空格,TAB,回车或非法数据认为该数据结束
        • 例如:对“%d”输入“12A”时,A 即为非法数据,所以认为该数据为 12 后结束
      3. 在输入字符数据时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符

        scanf("%c%c%c",&a,&b,&c);
        
        • 输入 "d e f" 时:是将 'd' 赋予 a、' ' 赋予 b、'e' 赋予 c
        • 只有输入 "def" 时:才能把 'd' 赋于 a、'e' 赋予 b、'f' 赋予 c
  • 字符输入函数—getchar() 函数

    • 功能:在键盘上输入一个字符

    • 需要的头文件:stdio.h

    • 一般语法格式:

      getchar();
      
      • 通常把输入的字符赋予一个字符变量,构成赋值语句

        char a;
        a = getchar();
        
    • 注意:getchar 函数只能接受单个字符,输入数字也按字符处理。输入多于一个字符时,只接收第一个字符

  • 字符输出函数—putchar() 函数

    • 功能:在显示器上输出单个字符

    • 需要的头文件:stdio.h

    • 一般语法形式:

      putchar(字符变量);
      
    • 示例:

      putchar('A');      //输出大写字母 A
      putchar(x);       //输出字符变量 x 的值
      putchar(‘\101’);  //也是输出字符 A
      putchar('\n');    //(换行)
      

      对控制字符则执行控制功能,不在屏幕上显示

1.4 变量和常量

  • 变量:值可变的量

    • 意义:确定目标并提供存放空间

    • 命名规则:

      1. 只能是英文字母(A-Z,a-z)和数字(0-9)或者下划线(_)组成
      2. 第一个字母必须是字母或者下划线开头
      3. 变量名严格区分大小写
      4. 不能使用关键之命名变量名
    • 变量的定义包括三个方面:数据类型、存储类型、作用域

    • 声明格式:

      数据类型 变量名
      
      • 数据类型举例:

        数据类型 描述
        char 字符类型,占用一个字节
        int 整型,通常反应所用机器中整数的最自然长度
        float 单精度浮点数
        double 双高精度浮点数
    • 示例:

      int a
      
  • 常见常量:值不发生改变的量

    1. 整型常量:1、2、3、5

    2. 实型常量:3.14、5.12

    3. 字符常量

      • 普通字符:'L'、'O'、'V'、'E'

      • 转义字符:'\n'、'\b'

    4. 字符串常量:"FishC"

      • 字符串=字符+转义字符

        • \n\,后面的 \ 表示忽略 \n,下一行是上一行的延续
      • 转义字符

        转义字符 意义 ASCII 编码
        \a 响铃
        \b 退格 008
        \f 换页 012
        \n 换行 010
        \r 回车 013
        \t 水平制表符 009
        \v 垂直制表符 011
        \\ 反斜杠 092
        \' 单引号 039
        \" 双斜杠 034
        \0 空字符 000
        \ddd 八进制的 1~3 位任意字符
        \uhhhh 十六进制的 1~2 位任意字符
    5. 符号常量:用标示符代表一个常量,需要提前定义,一般称为宏

      • 作用:一经定义,以后在程序中所有出现该标识符的地方均代之以该常量值

      • 宏定义格式:

        #define 标识符 常量
        

        #define 是一条预处理命令(预处理命令都以"#"开头),称为宏定义命令

        • 示例:

          #define DAY 07
          
      • 为了与普通常量区分,习惯使用全部大写来命名常量

      • 优点:

        1. 含义清楚
        2. 能做到“一改全改“
  • 标识符

    • 在程序中使用的变量名、函数名、标号等统称为标识符。除库函数的函数名由系统定义外,其余都由用户自定义

    • 命名规则跟变量一样,变量也是一种标识符

      • 标准 C 不限制标识符的长度,但它受各种版本的 C 语言编译系统限制,同时也受到具体机器的限制
      • 在标识符中,大小写是有区别的
    • 常量常用后缀:L 或 l 长整型;U 或 u 无符号数;F 或 f 浮点数

  • 关键字

    • 关键字是由C语言规定的具有特定意义的字符串,通常也称为保留字

    • 关键字分类:类型说明符、语句定义符、预处理命令字

    • 常见关键字

    auto break case char const continue default do
    double else enum extern float for goto if
    int long register return short signed sizeof static
    struct switch typedef union unsigned void volatile while
    inline restrict _Bool _Complex _Imaginary _Alignas _Alignof _Atomic
    _Static_assert _Noreturn _Thread_local _Generic

1.5 数据类型

  • 图示:
    image-20220706164324463

1.5.1 基本数据类型

  • 基本类型:值不可以再分解为其它类型

    基本类型 字符 说明
    字符类型 char
    整数类型 short int
    int
    long int
    long long int
    C 语言没有限定每个整数类型是多大字节,只制定了标准:
    short int <= int <= long int <= long long int
    浮点数类型 float
    double
    long double
    布尔类型 _Bool
    枚举类型 enum
  • 字符串类型:

    • C 没有为字符串设置单独的数据类型,而是使用字符类型来表示字符串类型

    • 语法格式:

      char 变量名[数量]; //声明字符串
      变量名[索引号]=字符; //赋值
      
    • 示例:

      char name[4];
      name[0] = 'S';
      name[1] = 'M';
      name[2] = 'Z';
      name[3] = 'Y';
      
      char name[4] ={'S','M','Z','Y'};
      

      事实上这个声明赋值是有问题的,没有结束字符 C 是无法确定结束的地方,会一直读取下去

      • 修改方法 1:扩充一位,填写 '\0'

        char name[5] ={'S','M','Z','Y','\0'};
        

        这样也会有问题,如果字符太长,就不方便统计长度,添加结束字符

      • 修改方法 2:取消限定字符长度

        char name[] ={'S','M','Z','Y'};
        

        但是,同样如果字符很长,就需要写多个单引号和逗号,也不方便

      • 修改方法 3:使用字符串常量表示

        char name[] ="SMZY";
        

        字符常量由单引号括起来,字符串常量由双引号括起来

  • 限定符:

    • 用于限定 char 类型或者任何整型的变量取值范围

    • signed(带符号位的,可以存放负数)和 unsigned(无符号位的,不可以存储负数,将负数的空间用来存放更多的正数)

    • 示例:有符号和无符号的 short 的语法格式

      [signed] short [int]
      unsigned short [int]
      
  • 符号位:

    • 在存放 signed 类型的存储单元中,左边第一位表示符号位
      • 如果符号位为 0,表示该数是一个正数
      • 如果符号位为 1,表示该数是一个负数
    • 所以比如一个 32 位的整型变量,去除左边第一个符号位,表示值得就只有 31 个比特位
  • 取值范围:

    • 比特位:CPU 能够读懂的最小单位,bit 或者 b

    • 字节:内存机构的最小存址单位,Byte 或者 B

      • 1 B = 8 b,约定
    • 进制

      二进制 十进制 十六进制
      0 0 0
      1 1 1
      10 2 2
      ... ... ...
      1001 9 9
      1010 10 A
      ... ... ...
      11111111 255 FF
  • 数据类型的取值范围:

    数据类型 字节数 取值范围
    char 1 -128~127
    unsigned char 1 0~255
    short 2 -32768~32767
    unsigned short 2 0~65535
    int 4 -2147483648~2147483647
    unsigned int 4 0~4294967295
    long 4 -2147483648~2147483647
    unsigned long 4 0~4294967295
    long long 8 -9223372036854775808~9223372036854775807
    unsigned long long 8 0~18446744073709551615
    float 4 1.1754910-38~3.402821038
    double 8 2.2250710-308~1.7976910308
    long double 12 2.2250710-308~1.7976910308
    • double 与 long double 取值范围一致,是精度不同
  • 补码

    • 计算机存放整数值的方式
    • 正数:补码就是该数的二进制形式
    • 负数:需要进行如下步骤获得:
      1. 取得该数得绝对值得二进制形式
      2. 将 1 得到的值按位取反
      3. 将 2 得到得值加 1
    • 例如:-8 的补码
      image-20220706173000729
    • 最大值 & 最小值
      • 最大值:127
        image-20220706192242862
      • 最小值:-128
        image-20220706192348367

1.5.2 其他数据类型的简单了解

  • 构造数据类型:

    • 定义:根据已定义的一个或多个数据类型用构造的方法来定义
    • 一个构造类型的值可以分解成若干个“成员”或“元素”。每个“成员”都是一个基本数据类型或又是一个构造类型
    • 种类:
      1. 数组类型
      2. 结构体类型
      3. 共用体(联合)类型
  • 指针类型:值用来表示某个变量在内存储器中的地址

    • 指针变量的取值类似于整型量,但这是两个类型完全不同的量,因此不能混为一谈
  • 空类型:在调用函数值时,返回的函数值是具有一定的数据类型的,应在函数定义及函数说明中给以说明

    • 但是,也有一类函数,调用后并不需要向调用者返回函数值,这种函数可以定义为“空类型”。其类型说明符为 void

1.5.3 数据类型转换

  1. 自动转换

    • 原则:
      1. 若参与运算量的类型不同,则先转换成同一类型,然后进行运算
      2. 转换按数据长度增加的方向进行,以保证精度不降低
        • 如 int 型和 long 型运算时,先把 int 量转成 long 型后再进行运算
      3. 所有的浮点运算都是以双精度进行的,即使仅含 float 单精度量运算的表达式,也要先转换成 double 型,再作运算
      4. char 型和 short 型参与运算时,必须先转换成 int 型
      5. 在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度左边长时,将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入向前舍入
  2. 强制转换

    • 形式:

      (类型说明符) (表达式)
      
    • 原则:

      1. 类型说明符和表达式都必须加括号(单个变量可以不加括号)

        • 例如:(int)(x+y) 写成 (int)x+y 意思就变了

          (int) (x+y);
          (int) x+y;
          

          变成了把 x 转换成 int 型之后再与 y 相加了

      2. 无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换, 而不改变数据说明时对该变量定义的类型

1.6 运算符

  • 算术运算符

    运算符 名称 示例
    + 加法运算符(双目) 1+1=2
    -
    *
    / 5/3=1
    5.0/3.0 = 1.66667
    % 求余运算符(双目) 5%3 = 2
    5.0 %3.0 = error
    + 正号运算符(单目) +5 = 5
    - 负号运算符(单目) - 5 = -5
  • 关系运算符

    运算符 名称 优先级
    < 小于
    <= 小于等于
    > 大于
    >= 大于等于
    == 等于
    != 不等于
  • 逻辑运算符

    运算符 名称 优先级
    ! 逻辑非
    && 逻辑与
    || 逻辑或
  • 位运算符

    运算符 名称
    & 按位与
    | 按位或
    ~ 按位非
    ^ 按位异或
    << 左移
    >> 右移
  • 强制类型转换运算符

    运算符 说明
    (类型说明符) (表达式) 将表达式的运算结果强制转换成类型说明符所表示的类型
  • 自增、自减运算符

    运算符 名称 说明
    ++ 自增 1 ++i:i 自增 1 后 i 再进行其他运算
    i++:i 运算后自增 1
    -- 自减 1 --i:自减 1 后 i 再进行其他运算
    i--:i 运算后再自减 1
  • 赋值运算符

    运算符 名称
    = 简单赋值运算符
    [+|-|*|/|%|...]= 复合赋值运算符
    [<<|&|...]= 复合位运算符
    • 赋值运算符具有右结合性

      a=b=c=5; //可以理解为 a=(b=(c=5))
      
    • 凡是表达式可以出现的地方均可出现赋值表达式

      x=(a=5)+(b=8);
      

      将 5 赋予 a,8 赋予 b,再把 a,b 相加之和赋予 x,故 x 应等于 13

    • 复合运算符一般形式:变量 双目运算符=表达式 等效于 变量=变量 运算符 表达式

      a+=5; //等价于 a=a+5
       x*=y+7; //等价于 x=x*(y+7)
       r%=p; //等价于 r=r%p
      
  • 逗号运算符

    运算符 说明
    , 将两个表达式连接起来组成一个表 达式
  • 条件运算符

    运算符 说明
    表达式1 ? 表达式2 : 表达式3 这是一个三目运算符,用于条件求值
  • 指针运算符

    运算符 说明
    * 取内容
    & 取地址
  • 求字节数运算符

    运算符 说明
    sizeof 为了获得数据类型或表达式的长度
    • 使用的三种方式:

      sizeof(object); //sizeof(对象)
      sizeof(type_name); //sizeof(类型)
      sizeof object; //size 对象
      
    • 不同操作系统输出的大小可能不一致

  • 特殊运算符

    运算符 说明
    () 括号
    [] 下标
    (→,.) 成员
    ... ...
  • 运算符的优先级

    • 运算优先级共分为 15 级。1 级最高,15 级最低。在表达式中,优先级较高的先于优先级较低的进行运算。而在一个运算量两侧的运算符优先级相同时,则按运算符的结合性所规定的结合方向处理
  • 运算符的结合性

    • 两种:左结合性(自左至右)和右结合性(自右至左)
    • 多数运算符具有左结合性
    • 单目运算符、三目运算符、赋值运算符具有右结合性

标签:字符,语言,输出,int,运算符,初识,printf,格式
来源: https://www.cnblogs.com/handsome-black/p/16595371.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有