C for ios --- 运算符

运算符的概念以及分类

1.运算符基本概念

  • 运算符是告诉编译程序执行特定算术或逻辑操作的符号。

+ 例如告诉程序, 某两个数相加, 相减等

2.运算符分类

  • 按照功能划分:

    • 算术运算符
    • 关系运算符与逻辑运算符
    • 按位运算符
  • 运算符根据参与运算的操作数的个数分为

    • 单目运算
      • 单目运算:只有一个操作数 如 : i++ ! sizeof
    • 双目运算
      • 双目运算:有两个操作数 如 : a+b
    • 三目运算
      • 三目预算:C语言中唯一的一个,也称为问号表达式 a>b ? 1 : 0

运算符的优先级以及结合性

本小节知识点:

  1. 【理解】优先级
  2. 【理解】结合性

1.优先级

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

    江哥提示:一般情况下不需要死记硬背优先级, 只需要记住()优先级最高即可


2.结合性

  • C语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结合性(自右至左)。
    • 算术运算符的结合性是自左至右,即先左后右。

~~
~~ 例如表达式: x-y+z
~~ 则y 应先与“-”号结合,执行 x-y 运算,然后再执行+z 的运算。这种自左至右的结合 方向就称为“左结合性”。
~~

” + 而自右至左 的结合方向称为“右结合性”。
~~
~~ 最典型的右结合 性运算符是赋值运算符例如:如x=y=z
~~ 由于“=”的 右结合性,应先执行y=z 再执行x=(y=z)运算。
~~


算术运算符

本小节知识点:

  1. 【理解】算术运算符
  2. 【掌握】结合性和优先级
  3. 【掌握】算术运算的注意点

1.算术运算符

名称符号说明
加法运算符+双目运算符,即应有两个量参与加法运算。如a+b,4+8等。具有左结合性。
减法运算符-双目运算符。但“-”也可作负值运算符,此时为单目运算,如-x,-5等具有左结合 性。
乘法运算符*双目运算符,具有左结合性。
除法运算符/双目运算符,具有左结合性。参与运算量均为整型时,结果也为整型,舍去小数。如果运算量中有一个是实型,则结果为双精度实型
求余运算符 (模运算符)%双目运算符,具有左结合性。要求参与运算的量均为整型,不能应用于float或double 类型。求余运算的结果等于两数相除后的余数,整除时结果为0。

- 整数除于整数,求出来的结果依然是整数
- 浮点型赋值给整型会损失小数部分
- %两侧必须都为整数
- 利用%求出来的余数是正数还是负数,由%左边的被除数决定,被除数是正数,余数就是正数,反之则反


2.结合性和优先级

  • 结合性:从左到右
  • 优先级:
    • * / % 优先级 大于 + -
    • 优先级相同则左结合计算
3*5/3+18
先算3*5
然后再算除3
最后结果再+18

3.算术运算的注意点

  • 1.自动类型转换
int a = 10.6;
int b = 10.5 + 1.7;
  • 2.自动将大类型转换为了小类型,会丢失精度
    自动类型提升
int b = 10.5 + 10;
  • 3.将右边的1提升为了double类型
double b = 1.0 / 2;
解决除法的精度问题
  • 4.强制类型转换
double a = (double)1 / 2;
double b = (double)(1 / 2);// 错误写法
  • 在计算过程中,参与运算的操作数不是同一类型,那么系统会自动将小类型转换为大类型。然后再进行转换

求余运算符

  1. 【理解】求余运算注意事项

1.求余运算注意事项

  • 参与运算的必须是整数
10 % 2 = 0
因为 10 可以被2整除, 没有余数

10 % 3 = 1
因为 10除以31, 所以结果为1
  • 错误写法
12.3 % 3
  • 注意
  • m%n 求余,相当于m/n 获取余数

    • (1)n等于0 无意义
    • (2)m等于0 结果为0
    • (3)m>n 正常求余 如:8 % 3 = 2
    • (4)m
10 % 3 = 1
-10 % 3 = -1
10 % -3 = 1

赋值运算符

本小节知识点:

  1. 【掌握】赋值运算符
  2. 【理解】赋值表达式及赋值语句

1.赋值运算符

+ 简单赋值运算符: =
+ 复合赋值运算符: +=、-=、*=、/=、%=

2.赋值表达式

  • 什么是表达式?

    • 将同类型的数据(如常量、变量、函数等),用运算符号按一定的规则连接起来的、有意义 的式子称为表达式。
    • 例如:算术表达式、逻辑表达式、字符表达式等。
  • 表达式的特点:

+ 表达式是一个意义的式子,所以一定有返回值

  • 赋值表达式

    • 由“=”连接的式子称为赋值表达式。
      • 例如: x = a + b;

    • 等号=左边只能是变量,不能是常量,下面的写法是错误的:10 = 10 + 5;
  • 凡是表达式可以出现的地方均可出现赋值表达式
  • 赋值运算符的结合性

    • 赋值运算符具有右结合性, 而且优先级比算术运算符低
      • 例如: int a = 3 + 5; 会先计算3 + 5, 然后再把结果赋值给a
      • 例如: int a = b = c = 5; 右结合性可理解为a=(b=(c=5))
  • 复合运算符

    本小节知识点:

    1. 【理解】复合赋值运算符

    1.复合赋值运算符

    • 在赋值符“=”之前加上其它二目运算符可构成复合赋值符。
      • /= 除后赋值 变量/=表达式 如:a/=3;即a=a/3
      • *= 乘后赋值 变量*=表达式 如:a*=3;即a=a*3
      • %= 取模后赋值 变量%=表达式 如:a%=3;即a=a%3
      • += 加后赋值 变量+=表达式 如:a+=3;即a=a+3
      • -= 减后赋值 变量-=表达式 如:a-=3;即a=a-3
    构成复合赋值表达式的一般形式为:
    变量 双目运算符 = 表达式; 如: a *= 1 + 2;
    它等效于
    变量 = 变量 双目运算符 表达式; 如: a = (1 + 2) * a;
    • 注意:赋值运算符优先级排名14位,仅仅高于“,”运算符。

    自增运算符

    本小节知识点:

    1. 【了解】自增、自减运算符介绍
    2. 【掌握】自增、自减运算符求值过程
    3. 【了解】练习

    1.自增、自减运算符介绍

    • 在程序设计中,经常遇到“i=i+1”和“i=i-1”这两种极为常用的操作。C语言为这种操作��供了两个更为简洁的运算符,即++和–,分别叫做自增运算符和自减运算符。它们是单目运算符,是从右向左结合的算术运算符。

    2.自增、自减运算符求值过程

    • 前缀表达式:++x, –x;其中x表示变量名,先完成变量的自增自减1运算,再用x的值作为表达式的值;即“先变后用”,也就是变量的值先变,再用变量的值参与运算。

    • 后缀表达式:x++, x–;先用x的当前值作为表达式的值,再进行自增自减1运算。即“先用后变”,也就是先用变量的值参与运算,变量的值再进行自增自减变化。

    int num = 3
    ++aa++
    表达式值43
    变量num值44

    + a++ 或者 ++a 都是表达式, 表达式是有返回值的
    + 表达式的值和变量的值不是一回事
    + a++ 或者 ++a表达式的值就是变量a的值

        int b;
        int a = 10;
       b = ++a;//如果++在前代表先自增再参与其它运算
    //    a = a + 1;  b = a;
    //    a = 11  b = 11
        int b;
        int a = 10;
        b = a++;//如果++在后代表先参与其它运算再自增
    //    b = a; a = a + 1;
    //    a = 11  b = 10
    • 练习
     i=1;
     i++;
     j = i++ ;
     j =++i ;
     j = i--;
    
    • 注意
    自增、自减运算只能用于单个变量,只要是标准类型的变量,不管是整型、实型,还是字符型变量等,但不能用于表达式或常量。如:++(a+b), 与5++, const int N=0; N++; 等都是错误 的。 而i+++j++++i+(++j)、++a+b++++array[--j],这些都是合法的。

    3.练习

    int i = 5, j = 5, p, q;
                        //     5       6       7
    p=i++ + i++ + i++; // p = (i++) + (i++) + (i++)                               //      6       7      8
    q = ++j + ++j+ ++j;// q = (++j) + (++j) + (++j)
    printf("%d,%d,%d,%d",p,q,i,j);
    输出: 18,21,8,8
    注意: ++, -- 优先级是2级(较高)
          ++, -- 结合性是右结合性

    sizeof运算符

    sizeof可以用来计算一个变量或一个常量、一种数据类型所占的内存字节数,内存字节数与所处的设备环境 64/32位 有关

    • 格式:用法:sizeof(常量/变量)
    • sizeof不是一个函数,是一个运算符
    • 如果使用sizeof计算,可以省略(),sizeof和变量之间以空格分开
    int number = sizeof 20;
    

    逗号运算符

    本小节知识点:

    1. 【了解】基本概念用法
    2. 【理解】求值过程

    3. 【了解】逗号运算符使用注意

    1.基本概念用法

    • 在C语言中逗号“,”也是一种运算符,称为逗号运算符。 其功能是把多个表达式连接起来组成一个表达式,称为逗号表达式。
      • 一般形式形式: 表达式1,表达式2,… …,表达式n;
      • 例如: a=a+1,b=3*4;

    2.求值过程

    表达式1,表达式2,… …,表达式n;
    - 逗号表达式的运算过程是:先算表达式1,再算表达式2,依次算到表达式n
    - 整个逗号表达式的值是最后一个表达式的值

    b = (a=4, ++a, a * 7);
    // 1.先执行第一个表达式, 将4赋值给a
    // 2.再执行第二个表达式, 让a自增变为5
    // 3.再执行第三个表达式, 5 * 7
    // 4.最后将最后一个表达式的值作为"逗号表达式的值"返回赋值给b, 所以b等于35
    

    3.逗号运算符使用注意

    • 程序中使用逗号表达式,通常是要分别求逗号表达式内各表达式的值,并不一定要求整个逗号表达式的值。

    • 并不是在所有出现逗号的地方都组成逗号表达式,如在变量说明中,函数参数表中逗号只是用 作各变量之间的间隔符。

    关系运算符

    本小节知识点:

    1. 【了解】为什么要学习关系运算符
    2. 【了解】C语言中的真假性
    3. 【掌握】关系运算符

    1.为什么要学习关系运算符

    • 默认情况下,我们在程序中写的每一句正确代码都会被执行。但很多时候,我们想在某个条件成立的情况下才执行某一段代码

    • 这种情况的话可以使用条件语句来完成,但是学习条件语句之前,我们先来看一些更基础的知识:如何判断一个条件成不成立。


    2.C语言中的真假性

    • 在C语言中,条件成立称为“真”,条件不成立称为“假”,因此,判断条件是否成立,就是判断条件的“真假”。

    - 怎么判断真假呢?C语言规定,任何数值都有真假性,任何非0值都为“真”,只有0才为“假”。也就是说,108、-18、4.5、-10.5等都是“真”,0则是“假”。

    3.关系运算符

    • 在程序中经常需要比较两个量的大小关系,以决定程序下一步的工作。比较两个量的运算符称为关系运算符。
    序号运算符结合性
    1>大于 如:a>b a>3 5>4 1>2左结合
    2<小于 如:a左结合
    3
    =
    大于等于 如: a>=1 d>=c左结合
    4<=小于等于 如: a<=0 i<=19左结合
    5==等于 i==3 a==b左结合
    6!=不等于 a!=b c!=5左结合

    - 关系运算符的运算结果只有2种:如果条件成立,结果就为1,也就是“真”;如果条件不成立,结果就为0,也就是“假”。

    int a = 4,b=10;
    int result = a>b; //0
    result = a == b; //0
    result = a<b; //1
    result = a+b>b; //1

    关系运算符优先级和结合性

    本小节知识点:

    1. 【掌握】关系运算符结合性
    2. 【掌握】关系运算符优先级

    1.关系运算符结合性

    • 关系运算符都是双目运算符,其结合性均为左结合。
      • 例如4>3>2:先算4>3,条件成立,结果为1。再与2比较,即1>2,条件不成立,结果为0。因此4>3>2的结果为0。

    2.关系运算符优先级

    • 关系运算符中==、!=的优先级相等,<、<=、>、>=的优先级相等,且前者的优先级低于后者

      • 例如2==3>1:先算3>1,条件成立,结果为1。再计算2==1,条件不成立,结果为0。因此2==3>1的结果为0。
    • 关系运算符的优先级小于算术运算符

      • 例如3+4>8-2:先计算3+4,结果为7。再计算8-2,结果为6。最后计算7>6,条件成立,结果为1。因此3+4>8-2的结果为1。

    -

    3.练习

    计算下列表达式的值
    3 > 4 + 7
    (3>4) + 7
    5 != 4 + 2 * 7 > 3 == 10
    写代码验证

    逻辑运算符

    本小节知识点:

    1. 【了解】逻辑运算符概念
    2. 【掌握】逻辑与
    3. 【掌握】逻辑或
    4. 【掌握】逻辑非

    1.逻辑运算符概念

    • 有时候,我们需要在多个条件同时成立的时候才能执行某段代码,比如:用户只有同时输入了QQ和密码,才能执行登录代码,如果只输入了QQ或者只输入了密码,就不能执行登录代码。这种情况下,我们就要借助于C语言提供的逻辑运算符。

    • C语言中��供了三种逻辑运算符:

      • &&(与运算)
      • ||(或运算)
      • !(非运算)

      • 逻辑运算的结果只有2个:“真”为1,“假”为0

    2.逻辑与

    • 格式:

      • “条件A && 条件B”
    • 运算结果:

      • 只有当条件A和条件B都成立时,结果才为1,也就是“真”;其余情况的结果都为0,也就是“假”。因此,条件A或条件B只要有一个不成立,结果都为0,也就是“假”
      • 口诀:一假则假
    • 逻辑与运算过程

      • 总是先判断条件A是否成立
      • 如果条件A成立,接着再判断条件B是否成立:如果条件B成立,“条件A && 条件B”的结果就为1,即“真”,如果条件B不成立,结果就为0,即“假”
      • 如果条件A不成立,就不会再去判断条件B是否成立:因为条件A已经不成立了,不管条件B如何,“条件A && 条件B”的结果肯定是0,也就是“假”
    • 运算过程示例:

      • 逻辑与的结合方向是“从左至右”。比如表达式 (a>3) && (a<5)
      • 若a的值是4:先判断a>3,成立;再判断a<5,也成立。因此结果为1
      • 若a的值是2:先判断a>3,不成立,停止判断。因此结果为0
      • 因此,如果a的值在(3, 5)这个范围内,结果就为1;否则,结果就为0
    • 使用注意

      • 若想判断a的值是否在(3,5)范围内,千万不能写成 3<a<5因为关系运算符的结合方向为“从左往右”。
        • 例如a为2,它会先算3

    3.逻辑或

    • 格式:

      • “条件A || 条件B”
    • 运算结果:

      • 当条件A或条件B只要有一个成立时(也包括条件A和条件B都成立),结果就为1,也就是“真”;只有当条件A和条件B都不成立时,结果才为0,也就是“假”。
      • 口诀:一真为真
    • 逻辑或运算过程

      • 总是先判断条件A是否成立
      • 如果条件A成立,就不会再去判断条件B是否成立:因为条件A已经成立了,不管条件B如何,“条件A || 条件B”的结果肯定是1,也就是“真”
      • 如果条件A不成立,接着再判断条件B是否成立:如果条件B成立,“条件A||条件B”的结果就为1,即“真”,如果条件B不成立,结果就为0,即“假”
    • 运算过程示例:

      • 逻辑或的结合方向是“从左至右”。比如表达式 (a<3) || (a>5)
      • 若a的值是4:先判断a<3,不成立;再判断a>5,也不成立。因此结果为0
      • 若a的值是2:先判断a<3,成立,停止判断。因此结果为1
      • 因此,如果a的值在(-∞, 3)或者(5, +∞)范围内,结果就为1;否则,结果就为0
    • 使用注意

      • C语言规定:任何非0值都为“真”,只有0才为“假”。因此逻辑或也适用于数值。比如 5 || 4的结果是1,为“真”;-6 || 0的结果是1,为“真”;0 || 0的结果是0,为“假”

    4.逻辑非

    • 格式:

      • “! 条件A”
    • 运算结果:

      • 其实就是对条件A进行取反:若条件A成立,结果就为0,即“假”;若条件A不成立,结果就为1,即“真”。也就是说:真的变假,假的变真。
      • 口诀:真变假,假变真
    • 运算过程示例:

      • 逻辑非的结合方向是“从右至左”。比如表达式 ! (a>5)
      • 若a的值是6:先判断a>5,成立,再取反之后的结果为0
      • 若a的值是2:先判断a>3,不成立,再取反之后的结果为1
      • 因此,如果a的值大于5,结果就为0;否则,结果就为1
    • 使用注意:

      • 可以多次连续使用逻辑非运算符:!(4>2)结果为0,是“假”,!!(4>2)结果为1,是“真”,!!!(4>2)结果为0,是“假”
        +C语言规定:任何非0值都为“真”,只有0才为“假”。因此,对非0值进行逻辑非!运算的结果都是0,对0值进行逻辑非!运算的结果为1。!5、!6.7、!-9的结果都为0,!0的结果为1

    逻辑运算符结合性和优先级

    本小节知识点:

    1. 【掌握】优先级

    2. 【掌握】短路问题

    1.优先级

    !(非) // 注意
      ↑
    算术运算符
      ↑
    关系运算符
      ↑
    &&和||  // 注意
      ↑
    赋值运算符

    • 逻辑非优先级
        int result = !0 + 1;
        printf("result = %d", result);
        输出结果: 2
        >先计算!0等于1
        >然后再用计算结果加上1
    • 算术运算符与逻辑运算符优先级
        int result = 3 + 3 && 0 + 1;
        //          (3 + 3) && (0 + 1);
        printf("result = %d", result);
        输出结果: 1
        >先计算3+30+1等到61
        >然后6&&1
    • 关系运算符与逻辑运算符优先级
        int result = 3>5 || 2<4 && 6<1;
        //          (3>5) || (2<4) && (6<1)
        //            0   ||   1   &&  0
        //                     1 && 0
        printf("result = %d", result);
        输出结果: 0
        >先计算3>5,2<4,6<1得到结果0,1,0
        >再进行逻辑运算0||1得到结果1
        >再进行逻辑运算1&&0得到结果0
    • 练习
    3+2<5||6>3
    4>3 && !-5>2

    2.短路问题

    • 与短路:&& 只要第一个条件表达为假那么后面的条件表达就不参与运算了
        int a = 10;
        int b = 20;
        int result = (a > 19) && (b++ > 6);
        printf("a = %d,b = %d, result = %d\n", a, b, result);
    输出结果:a = 10,b = 20, result = 0
    • 或短路:|| 只要第一个条件表达式为真那么后面的条件表达式就不参与运算了
        int a = 10;
        int b = 20;
        int result = (a > 19) || (b++ > 6);
        printf("a = %d,b = %d, result = %d\n", a, b, result);
    输出结果:a = 10,b = 21, result = 1

    三目运算符

    本小节知识点:

    1. 【了解】条件运算符概念
    2. 【了解】注意点

    3. 【了解】练习

    1.条件运算符概念

    • 条件运算符是C语言的唯一的三目运算符,即它需要3个数据或表达式构成条件表达式

    • 格式:

      • 表达式1?表达式2(结果A):表达式3(结果B)
    • 求值规则:

      • 如果表达式1为真,三目运算符的运算结果为表达式2的值(结果A),否则为表达式3的值(结果B)
    示例:
        int a = 10;
        int b = 20;
        int max = (a > b) ? a : b;
        printf("max = %d", max);
        输出结果: 20
    等价于:
        int a = 10;
        int b = 20;
        int max = 0;
        if(a>b){
          max=a;
        }else {
           max=b;
        }
        printf("max = %d", max);

    2.注意点

    • 条件运算符的运算优先级低于关系运算符和算术运算符,但高于赋值符。
    例如:
    max=(a>b)? a:b;
    可以去掉括号而写为:
    max=a>b?a:b;
    • 条件运算符?和:是一对运算符,不能分开单独使用。

    • 条件运算符的结合方向是从右至左

    例如:
    a>b?a:c>d?c:d;
    应理解为:
    a>b?a:(c>d?c:d)

    3.练习

    1.用户从键盘上输入三个整数,找出最大值,然后输入最大值
    思路:
    //1、定义变量 num1,num2,num3,max
    //2、先比较 num1 和 num2,比较的结果存放到max //3、max和第三个数比较

    选择结构-if练习

    本小节知识点:

    1. 【理解】判断奇偶数
    2. 【理解】输出对应星期
    3. 【理解】输出对应季节
    4. 【理解】获取两个数最值
    5. 【理解】获取三个数最值
    6. 【理解】排序

    1.判断奇偶数

    • 从键盘输入一个整数,判断其是否是偶数,如果是偶数就输出YES,否则输出NO;
    //    1.提示输入信息
        printf("输入一个整数\n");
    //    2.接收输入信息
        int value;
        scanf("%d", &value);
    //    3.判断是否能被2整除
        if (value%2 == 0) {
        //    输出偶数
            printf("yes");
        }else{
            printf("no");
        }

    2.输出对应星期

    • 接收用户输入的1~7的整数,根据用户输入的整数,输出对应的星期几
    //    1.提示用户输入星期几
        printf("请输入星期几(1~7)\n");
    //    2.接收用户输入的星期数
        int day;
        scanf("%d",&day);
    
    //    3.输出对应的星期
         --》1.用屌丝做法 每天一个if
         --》2.用高帅富做法 if else if
        if(day == 1)
        {
            printf("星期1\n");
        }
        else if(day == 2)
        {
            printf("星期2\n");
        }
        else{
            printf("地球不属于你\n");
        }

    3.输出对应季节

    • 接收用户输入的一个整数month代表月份,根据月份输出对应的季节
    //    1.提示用户输入月份
        printf("请输入月份(\n");
    //    2.接收用户输入的星期数
        int month;
        scanf("%d",&month);
    //      3.输出对应的月份
        if (month >=3 && month <=5) {
             printf("春季\n");
        }else if (month >=6 && month <=8)
        {
            printf("夏季\n");
        }else if (month >=9 && month <=11)
        {
            printf("秋季\n");
        }else if(month == 12 || month == 1 || month == 2)
        {
            printf("春季\n");
        }else
        {
            printf("地球不属于你\n");
        }
    
        if(month >12 || month <1){
            printf("地球不属于你\n");
        }
        else if(month >=3 && month <=5)
        {
            printf("春季\n");
        }
        else if(month >=6 && month <=8)
        {
            printf("夏季\n");
        }
        else if(month >=9 && month <=11)
        {
            printf("秋季\n");
        }
        else
        {
            printf("冬季\n");
        }

    4.获取两个数最值

    • 键盘输入两个整数,判断大小后输出较大的那个数
        int num1, num2;
        printf("输入两个整数并用逗号隔开\n");
        scanf("%d,%d", &num1, &num2);
    
        if (num1 > num2) {
            printf("%d\n",num1);
        }else{
            printf("%d\n",num2);
        }
    
        printf("%d\n",num1 > num2 ? num1 : num2);
        三元运算符好处:可以简化if else代码
        弊端     :因为是一个运算符所以运算完必要要有一个结果。  简单用三元 复杂用if(阅读性好)

    5.获取三个数最值

    • 从键盘输入3个整数,判断大小后输出较大的那个数
    • 方式1
        int num1, num2, num3;
        printf("输入3个整数并用逗号隔开\n");
        scanf("%d,%d,%d", &num1, &num2, &num3);
        // 方式1
        int max;
        if (num1 > num2) {
            max = num1;
        }else{
            max = num2;
        }
    
        if (max < num3) {
            max = num3;
        }
        printf("%d\n",max);
    • 方式2
        int max1 = num1 > num2 ? num1 : num2;
        int max = max1 > num3 ? max1 : num3;
        printf("%d\n",max);
    • 方式3
        if (num1 >= num2 && num1 >= num3) {
            printf("%d\n",num1);
        }else if (num2 >= num1 && num2 >= num3) {
            printf("%d\n",num2);
        }else if (num3 >= num1 && num3 >= num2) {
            printf("%d\n",num3);
        }
    • 方式4(先写不省略括号)
       if (number1 > number2) {
            // 代表number1当前最大
            if (number1 > number3) {
                max = number1; // number1是最大
            }else
            {
                max = number3; // number3是最大
            }
        }else if (number2 > number3) // 因为if条件不满足, 所以此时此刻number2是最大的
        {
            // 代表number2当前最大
            max = number2;
        }else // 因为上面两个条件都不满足, 所以此时number3最大
        {
            max = number3;
        }
        printf("max = %i\n", max);

    6.排序

    • 从键盘输入3个整数,排序后输出
    • 方式1
        int a, b, c;
        printf("输入3个整数并用逗号隔开\n");
        scanf("%d,%d,%d", &a, &b, &c);
        //     方式1 写出所有方式
        if (a >= b && b >=c) {
            printf("%d > %d > %d\n", a, b, c);
        }else if (a >= c && c >= b) {
            printf("%d > %d > %d\n", a, c, b);
        }else if (b >= a && a >= c) {
            printf("%d > %d > %d\n", b, a, c);
        }else if (b >= c && c >= a) {
            printf("%d > %d > %d\n", b, c, a);
        }else if (c >= a && a >= b) {
            printf("%d > %d > %d\n", c, a, b);
        }else if (c >= b && b >= a) {
            printf("%d > %d > %d\n", c, b, a);
        }
    • 方式2
        int a, b, c;
        printf("输入3个整数并用逗号隔开\n");
        scanf("%d,%d,%d", &a, &b, &c);
    //    方式2(选择排序,画图讲解)
        int temp;
        if (a < b) {
            temp = a;
            a = b;
            b = temp;
        }
        if (a < c) {
            temp = a;
            a = c;
            c = temp;
        }
        if ( b < c) {
            temp = b;
            b = c;
            c = temp;
        }
        printf("%d > %d > %d\n", a, b, c);

    选择结构-if注意点

    本小节知识点:

    1. 【理解】if语句的使用注意点

    1.if语句的使用注意点

    • “;” 空语句
      • if(条件) 可以直接写分号 “;” 表示什么也不干
    if(10 > 2);
    {
        printf("10 > 2");
    }
    输出结果: 10 > 2
    • 任何数值都有真假性
      • if(1)、if(-1) 表示永真 if(0) 表示为永假
        if (0) {
            printf("123\n");
        }
    • 判断变量与常量问题
      • 但凡遇到比较一个变量等于或者不等于某一个常量的时候,把常量写在前面
        // if(a = 0) // 错误写法, 但不会报错
        if (0 == a) {
            printf("a的值是0\n");
        }else{
           printf("a的值不是0\n");
        }
    • 变量作用域问题
    if (age > 10) {
        printf("已经懂事了\n");
        int num = 1000;
    }
    printf("num = %d\n",num);
    • 作用域混乱
      • 想在if后面定义变量必须写{}
        if (0)
            int a = 10; // 这句会报错
        printf("a = %d\n", a);
    • 省略大括号问题
      • if else是一个整体, else匹配if的时候匹配离它最近的一个if
        if(0)
        if(1)
            printf("A\n");
        else
            printf("B\n");
        else
        if (1)
            printf("C\n");
        else
            printf("D\n");

    类型转换问题

    本小节知识点:

    1. 【掌握】算术运算中的类型转换

    1.类型转换问题

    • 类型转换分为:

      • 隐式数据类型转换
      • 显示数据类型转换
    • 自动转换(隐式转换):

    • 自动转换发生在不同数据类型的量混合运算时,由编译系统自动完成。
    • 自动转换遵循以下规则:
      • 相同数据类型的值才能进行运算(比如加法运算),而且运算结果依然是同一种数据类型。系统会自动对占用内存较少的类型做一个“自动类型提升”的操作
      • 若参与运算量的类型不同,则先转换成同一类型,然后进行运算。
      • 转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转 成long型后再进行运算。
      • 所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成 double型,再作运算。
      • char型和short型参与运算时,必须先转换成int型。
      • 在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度,丢失的部分 按四舍五入向前舍入。
    doublelongunsignedintchar|short
    例如:
    int i = 1;
    i = i + 8.808
    printf("%d", i);
    输出结果: 9
    
    按照隐式处理方式,在处理i = i + 8.808时
    首先i转换为double型,然后进行相加,结果为double 型,再将double型转换为整型赋给i
    • 强制类型转换(显示转换):
    • 强制类型转换是通过类型转换运算来实现的
      • 其一般形式为:(类型说明符) (表达式)
    (float) a; /* 把a转换为实型 */
    (int)(x+y); /* 把x+y的结果转换为整型 */
    int i = 1;
    i = i + (int)8.808
    printf("%d", i);
    输出结果: 9
    这时直接将8.808转换成整型,然后与i相加,再把结果赋给i。
    
    其实: 这样可把二次转换简化为一次转换。
    int i = 1;
    i = (int)(i + 8.808)
    printf("%d", i);
    
    或者让系统隐式转换
    int i = 1;
    i = i + 8.808
    printf("%d", i);
    • 强制类型转换注意点
      • 将大范围的数据赋值给小范围变量时,系统会自动做一个强制类型转换的操作,这样容易丢失精度
      • 类型说明符和表达式都必须加括号(单个变量可以不加括号),如把(int)(x+y)写成(int)x+y则成了把x转换成int型之后再与y相加了。
      • 无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类型。
    float floatValue = 10.1f;
    int sum = 4 + (int)floatValue ;
    printf("sum = %d", sum);// 输出14
    //  floatValue本身的值并没有改变
    printf("floatValue = %f", floatValue); // 输出10.100000

    石头剪子布实现

    本小节知识点:

    1. 【理解】应用:剪刀石头布游戏代码实现

    #include <stdio.h>
    #include <stdlib.h>
    int main(int argc, const char * argv[]) {
    
        // 定义 0.剪刀 1.石头 2.布
        // 1、定义变量 玩家和电脑
        int player,computer=0;
    
        // 2、让电脑先出拳
        //随机出拳
        //如何进行随机出拳,借助一个stdlib.h下一个产生随机数的函数
        // arc4random_uniform(n) 0~n-1之间的随机的整数
        computer = arc4random_uniform(3); //0 1 2
        //printf("%d\n",computer);
    
        // 3、用户出拳
        printf("请出拳:0.剪刀 1.石头 2.布\n");
        scanf("%d",&player);
        // 数据合法性的校验
        if (player<0||player>2) {
            printf("非法的输入");
            return 0;
        }
        // 4、判断比较 //先判断用户赢的情况
        if((player==0&&computer==2)||
        (player==1&&computer==0)||
        (player==2&&computer==1)){
    
            printf("我靠,你赢了!\n");
    
        }else if((computer==0&&player==2)||
        (computer==1&&player==0)||
        (computer==2&&player==1)){
    
            printf("很遗憾,你输了!\n");
    
        }else{
    
            printf("平局\n");
    
        }
        return 0;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值