10月31日答疑

如何写表达式

how to write expression

// 3种逻辑表达式
// && || !
A && B   A || B  !A
   
B第二 || A第三 == true  B第二 && A第三 == false
B第二 || E第四 == true  B第二 && E第四 == false
C第一 || D第二 == true  C第一 && D第二 == false
C第五 || D第三 == true  C第五 && D第三 == false
E第四 || A第一 == true  E第四 && A第一 == false

A第三  E第四   C第五    D第二  B第一

 

if else语句

//单分支结构
if(expression)
{
statement1;
}

if
(expression)

   if (secondexpression) statement1; // 注意这个if与下面的else构成双分支结构,不是与上一个if构成嵌套分支
else
   statement2;

// 双分支结构
if(expression)
{
   // 嵌套分支
   if (secondexpression) statement1;
}
else
   statement2;

// 多分支结构,只会执行一个分支
if ()
{
   
}
else if()
{
   
}
else
{
   
}

// 下面的if语句都会进行判断,如果条件之间有交集可能会导致bug
if ()
{  
}
if ()
{  
}

else和最近的if相匹配,如果使用嵌套的if else的话 {}不可缺少, 同一级别 if else if else 只会执行一个 一连串的if 和一连串的if 、else if、 else的区别 一连串的if会依次进行判断,可能会导致多个符合条件的if块中的语句执行 if 、else if  、else只会执行一个块中的语句

逻辑表达式的短路原则

if(condition1 && condition2) # 如果condition1为假,不会再去计算condition2

if (condition1 || condition2) # 两个condition的真假都会被计算

a > b ? c + d : e+f 三目运算符?:,如果a > b 则计算c + d,否则计算 e + f

 

等价的循环结构

//i从[0,n) 共执行n次循环

for
(int i = 0; i < n; i++)

{
  ...
}

int i = 0;
while(i < n)
{
  ...
   i++;
}
// do while结构使得循环至少执行一次
do
{

...
}while(b)

// {}里的语句会在while循环前执行一次    

{
  ...
}
while(b)
{
  ...;
}

 

continue

while(a)
{
   if(b) // 如果条件b为真,则跳过下面的printf语句,不进行输出
  {
       continue;
  }
printf("hello world\n");
}

// same
while(a)
{
   if(!b) // 如果不满足b条件则进行输出与上面等价
  {
      printf("hello world\n");
  }
}

 

break

while(a)
{
  ...
   if (b)
break; // 满足b条件则跳出循环,循环结束 这种写法使得循环有一个入口,多个出口,不好
}

// same
// 循环语句应该只有一个入口,一个出口
while(a && !b) // 不满足b条件则继续循环
{
   if(!b) // 不满足b条件则执行相应的语句
  {
      ...
  }
}

 

switch

case中为一个常量表达式,必须为整型或枚举类型

// 计算某年某月的天数为例
// if else if else写法

#include<stdio.h>
#include<stdbool.h>
// 判断是否是闰年
bool isLeapYear(int year)
{
   // 年份能被400整除 或 年份能被4整除不能被100整除
   if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))
  {
       return true;
  }
   else
  {
       return false;
  }
}

int main(int argc, char **argv)
{
   int year,month;
int day;
   scanf("%d%d",&year, &month);
   if(month == 1
     || month == 3
     || month == 5
     || month == 7
     || month == 8
     || month == 10
     || month == 12)
  {
  day = 31;
  }  
 
  else if(month == 2)
  {
  day = 28;
 if (isLeapYear(year))
{
 day = 29;
}
  }
  else
  {
  day = 30;
  }
  printf("%d", day);
  return 0;
}
// switch case 写法
// 计算某年某月的天数为例

#include<stdio.h>
#include<stdbool.h>
// 判断是否是闰年
bool isLeapYear(int year)
{
   // 年份能被400整除 或 年份能被4整除不能被100整除
   if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))
  {
       return true;
  }
   else
  {
       return false;
  }
}

int main(int argc, char **argv)
{
   int year,month;
int day = 0;
   scanf("%d%d",&year, &month);
switch(month) //month必须为整型、字符型、或枚举类型
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
{
day = 31;
break;
}
case 2:
{
day = 28;
if (isLeapYear(year))
{
day = 29;
}
break;
}
case 4:
case 6:
case 9:
case 11:
{
day = 30;
break;
}
default:
break;
}
   printf("%d", day);
  return 0;
}

Comments  

# Moderator 2021-11-07 18:24
不同类型混合运算时,请加括号。

You have no rights to post comments