C语言完全听懂系列 - day7

  • if后面的条件,可以写一个条件a == 3,也可以写多个,a == 3 && b == 4,表示a等于3且b=4,||是或。
  • C语言中的运算符是有优先级的,按优先级从大到小分为三类,算术运算符(+ - * / %),比较运算符(== != >= > < <=),逻辑运算符(&& ||),优先级高的运算符先计算。同一类的运算符比较优先级时,算术运算符按数学上的优先级来,也就是乘除大于加减,逻辑运算符与(&&)的优先级大于或(||),其他的就认为是从左到右来。这东西不用记,优先级通常是符合直觉的。
  • 算术运算的结果是一个具体的数字,比如说1 + 2结果是3,逻辑运算(包括比较)的结果只有两种可能,1或者0。1表示条件成立,这句判断为真,0表示条件不成立,这句判断为假。x >= 0这个表达式的计算结果,要么为1,要么为0。用在if里的时候,当且仅当括号里的表达式,计算结果为1时,执行if后面的代码块。
  • 一个年份是闰年,必须满足下面两个条件之一
    • 能被 400 整除(如:1600、2000 是闰年)
    • 能被 4 整除但不能被 100 整除(如:2024 是闰年,1900 不是)
  • 我们尝试用代码实现闰年判断:
    if (year % 400 == 0 || year % 4 == 0 && year % 100 != 0) {
        printf("%d 是闰年。\n", year);
    } else {
        printf("%d 不是闰年。\n", year);
    }
  • 我们分析一下这个判断闰年的条件表达式的计算顺序:
    • 从左到右计算year % 400, year % 4, year % 100,假设分别得到x, y ,z,代入回表达式
    • 判断x == 0, y == 0, z != 0,假设分别得到x1, y1, z1,代入回表达式
    • 因为&&优先级更高,先计算y1 && z1,得到结果y2,然后计算x1 || y2,得到结果1或者0,结果为1时执行if
  • 在数学上,我们会用小括号来提高优先级,比如说(3 - 4) * 2,同样的在代码里,如果你想让某个表达式先算,又不确定他的优先级是怎么样的,就直接套一层小括号就好了
  • 比较反直觉的可能是&&的优先级大于||,这个好像是为了和数学上的运算规则保持一致,布尔代数什么的,不太懂。
  • 扩展:逻辑运算符有一个特性叫短路求值,比如说a > 0 && b > 1,先计算a > 0,假如说已经不成立了,考虑&&运算的定义,这个表达式本身必然就不成立了,那么计算机就不会去判断b是否大于1了,表达式的结果直接返回0,省了一次计算。||运算符同理,如果a为真,无论b是否为真,结果都必定为真,不会计算第二个表达式。
  • 现在我们讲完了必要的前置知识,我们做个小练习,实现一个简单的石头剪刀布的小游戏:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
    int player, computer;

    printf("Welcome to Rock-Paper-Scissors!\n");
    printf("Please choose: 0 = Rock, 1 = Scissors, 2 = Paper\n");
    printf("Your choice: ");
    scanf("%d", &player);

    srand(time(NULL));
    computer = rand() % 3;

    printf("Computer chooses: %d\n", computer);

    if (player == computer) {
        printf("It's a draw!\n");
    } else if ((player == 0 && computer == 1) ||
               (player == 1 && computer == 2) ||
               (player == 2 && computer == 0)) {
        printf("You win!\n");
    } else {
        printf("You lose!\n");
    }

    return 0;
}
  • 请大概参考一下这份代码,看懂了什么意思之后,暂时关了这个窗口,自己在编程软件里写一遍,确认能顺利运行就好。
posted @ 2025-06-24 23:05  merlbc  阅读(18)  评论(0)    收藏  举报