c语言是一门结构化程序设计语言
支持三种结构
1:顺序结构
2:选择结构 如IF switch
3:循环结构 如while for do……while
if(表达式)
语句想要进入IF分支就要先判断表达式是否正确,若表达式为“true”,就进入IF分支,执行语句,若表达式为“false”,就不进入IF分支,执行IF分支以及语句外面的代码,0表示"false",非0表示"true"

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int num1;
scanf("%d",&num1);
if (num1 == 5)
printf("num1的值是5");
return 0;
}

可以看到当我们输入5的时候,表达式结果为“true”,就执行IF分支里面的代码,当我们输入4的时候,表达式结果为“false”,就没有执行IF分支的代码
else可以看作成是IF分支的表达式结果为“false”的执行代码,当表达式结果为“false”的时候就进入else代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int num1;
scanf("%d",&num1);
if (num1 == 5)
printf("num1的值是5\n");
printf("num1的值是正确的");
else
printf("num1的值是错误的");
return 0;
}此时我们运行程序后一定会报错

可以看到有一个报错“没有匹配if的非法else”,这是因为if语言默认只匹配一条语句,else一样
如果要匹配多条语句就要在if或else后面加大括号(只有一个语句可以加大括号)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int num1;
scanf("%d",&num1);
if (num1 == 5)
{
printf("num1的值是5\n");
printf("num1的值是正确的");
}
else
{
printf("num1的值是错误的\n");
printf("输入错误");
}
return 0;
}

我们可以在if里面嵌套多个if或if……else,构成多重判断
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int age;
scanf("%d",&age);
if (age >=18)
{
printf("成年人\n");
if (age >= 25)
{
printf("25岁及以后的成年人比18岁的要大\n");
}
else
{
printf("要小\n");
}
}
else
{
printf("未成年\n");
}
return 0;
}当我们输入的年龄大于等于18岁就进入if语言,且输入的年龄比18岁还要大就进入if嵌套中的第一个if语句,反之就进入第一个if语句中的else语句,如果输入的年龄比18岁小就进入第一个if语句配套的else语句



若我们在else嵌套if语句就可以这样写
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int num1;
scanf("%d",&num1);
if (num1 == 0)
printf("这是一个数字0");
else
if (num1 > 0)
printf("这个数字大于0");
else
printf("这个数字小于0");
return 0;
}当我们输入的数字不是0的时候,代码就会执行第一个if语句配套的else语句里面,此时执行代码也是正确的,但我们可以优化一下代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int num1;
scanf("%d",&num1);
if (num1 == 0)
printf("这是一个数字0");
else if (num1 > 0)
printf("这个数字大于0");
else
printf("这个数字小于0");
return 0;
}写成else if的形式更加高效简单



#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int num1=1;
int num2 = 2;
if (num1 == 0)
if (num2 == 2)
printf("输出2");
else
printf("没有输出的数字");
return 0;
}这段代码按照我们的理解来的话就是第一个if为“false”,但第二个if为“true”,就会执行第二个if分支,但是这里没有任何输出,包括else下面的代码也没有输出

那为什么会出现这种情况呢?因为else总是和最近的if匹配,就算将else的位置放在和最远的if分支一样对应的位置也不会匹配该if分支,所以代码的逻辑就是第一个if为“false”之后就无法进入第二个if else了,程序就没有任何输出了,正确代码应该是这样的,if else嵌套在第一个if分支里面
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int num1=1;
int num2 = 2;
if (num1 == 0)
if (num2 == 2)
printf("输出2");
else
printf("没有输出的数字");
return 0;
}单目运算符就是仅对一个操作数进行运算,操作符通常在操作数的前后
自增/自减
num1++或++num1,num1--或--num1(同理)
num1++意思是将num1本身的数字赋值给num1++本身,然后将num1+1后赋值给num1,
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int num1=1;
printf("%d\n",num1);
printf("%d", num1++);
return 0;
}
为什么都是1,因为num1++是先使用num1的值,然后再加“1”后赋值给num1,那我们再加一行输出num1的代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int num1=1;
printf("%d\n",num1);
printf("%d\n", num1++);
printf("%d\n", num1);
return 0;
}
那为什么第一个num1输出1,第三个num1 输出2,因为程序执行默认为顺序执行,执行第一行后输出1,第二行就执行num1++后,num1从“1”变为"2",第三行再执行输出num1,这个时候num1就为“2”
那我们将“num1++”换成“++num1”会怎么样?
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int num1=1;
printf("%d\n",num1);
printf("%d\n", ++num1);
printf("%d\n", num1);
return 0;
}
此时我们可以看到第二个和第三个都为“2”,这是因为“++num1”是先对num1加1后再赋值给“++num1”,然后“++num1”会将值赋值给num1
同理:num1+=3就为num1=num1+3,num1*=3就为num1=num1*3,减法和除法同理
c语言中0表示“false”,所有非0的数表示“true”
一个等号叫作“赋值运算”,两个等号叫作“等于”
int num1=10;//表示创建一个名为“num1”的整型变量,并给它赋初始值“10”
int num1;
num1=10; //表示先定义一个整型变量,再将10赋值给num1
num1==10; // 表示num1 的值是否与10相等
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int num1;
scanf("%d",&num1);
if (num1 = 1)
{
printf("输出数字1");
}
else
{
printf("输出不是数字1");
}
return 0;
}这段代码的结果我们本来想要让它对我们输入的数字进行判断,如果为“true”就执行IF分支,为“false”就执行else语句,但我们输入的是一个“=”,就变成了不管我们输入的数字是几,都会将“1”赋值给num1,就会执行IF分支,导致输出错误

改正的话就是需要将“=”换成“==”就可以了

!=就是不相等的意思
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int num1=1;
if (num1 != 1)
{
printf("输出的数不是1");
}
return 0;
}此时num1初始值为1,进入IF分支表达式后结果为“false”,就不会进入IF语句

> < >= <= + - * / 同理,不逾矩
%,求余数
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int num1=10;
int num2 = num1 % 3;
printf("%d",num2);
return 0;
}
三目运算符也称为条件操作符,需要三个操作数
格式 表达式1?表达式2:表达式3
符号是?和:
当表达式1为真的时候执行表达式2,整个表达式的结果就为表达式2,当表达式1为假的时候返回表达式3,整个表达式的结果就为表达式3
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int num1 = 0;
int num2 = 0;
scanf("%d %d",&num1,&num2);
int r = (num1 > 0 ? num2 : num2 - 12);
printf("%d",r);
return 0;
}
num1>0为“true”,所以返回num2表达式的值

num1<0为“false”,返回num2-12表达式的值
(第一个,第二个,第三个)
逗号表达式返回最后一个表达式或值
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int num1 = 0;
int num2 = 0;
scanf("%d %d",&num1,&num2);
int r = (num1,num2+12,num1+13);
printf("%d",r);
return 0;
}逗号表达式返回值为最后一个表达式或值,所以就会返回num1+13

“!”逻辑取反运算符,对单个表达式取返,例:(!真)=(假)(!假)=(真)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int num1;
scanf("%d",&num1);
if (num1 == 0)
printf("1.输出正确\n");
if (!num1)
printf("2.输出正确");
return 0;
}
第一个if表达式为真,进入语句,第二个num1为0,为“false”,不能进入语句,但是“!”对单个表达式取反就是“true”,进入第二个语句
A | B | A&&B |
|---|---|---|
0 | 非0 | false |
非0 | 0 | false |
0 | 0 | false |
非0 | 非0 | true |
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int num1;
scanf("%d", &num1);
if (num1 >= 1 && num1 <= 3)
printf("春天");
else
printf("不是春天");
return 0;
}当num1大于等于1并且num1小于等于3的时候,才能正确输出“春天”,否则就不是“春天”


A | B | A||B |
|---|---|---|
0 | 非0 | true |
非0 | 0 | true |
0 | 0 | false |
非0 | 非0 | true |
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int num1;
scanf("%d", &num1);
if (num1 == 1 || num1 == 2 || num1 == 3)
printf("春天");
else
printf("不是春天");
return 0;
}


再给大家分享一个易错案例
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int num1;
scanf("%d", &num1);
if (num1 >= 1 || num1 <= 3)
printf("春天");
else
printf("不是春天");
return 0;
}这串代码当num1大于等于1或者num1小于等于3的数都可以输出“春天”

当num1输入5的时候,输出“春天”,此时就是错误答案,大家一定要记住这个问题!!!
c语言逻辑运算有一个特点,总是先计算左边的,再计算右边的
在“&&”与运算符中,当第一个表达式为“true”时,再计算右边的表达式,如果右边的表达式为“true”,再计算两个表达式的与运算,若最后与运算的结果为“true”,继续计算右边的表达式,如果一直为“true”,就计算到所有表达式结束
如果左边的表达式为“false”,再计算右边表达式,如果为“true”,就计算与运算,与运算结果为“false”,就停止运算,剩下的表达式都不再进行计算了
#include <stdio.h>
int main()
{
int a = 1, b = 2, d = 3;
int i = a++ && ++b && d++;
printf("%d %d %d",a,b,d);
return 0;
}a++返回值是“1”,a就返回2,此时a++表达式为”true“,++b返回值是”3“,b的返回值也是3,此时计算与运算可以得到两个表达式结果为”true“,就继续计算剩下的表达式,d++表达式返回值是”3“,d返回”4“,再计算与运算,返回值为”true“,没有表达式了,所以计算结束,最后打印输出值为”2“”3“”4“

如果第一个表达式为”false“,就结束运算
#include <stdio.h>
int main()
{
int a = 0, b = 2, d = 3;
int i = a++ && ++b && d++;
printf("%d %d %d",a,b,d);
return 0;
}
如果第一个表达式为为”true“,就计算第二个表达式,若返回”false“,再计算与运算,结果为”false“,就结束运算
#include <stdio.h>
int main()
{
int a = 1, b = 0, d = 3;
int i = a++ && b++ && d++;
printf("%d %d %d",a,b,d);
return 0;
}
在”||“或运算中,当第一个表达式为“false”时,再计算右边的表达式,如果右边的表达式为“flase”,再计算两个表达式的或运算,最后或运算的结果为“false”,继续计算右边的表达式,如果一直为“false”,就计算到所有表达式直到结束或者有很多个表达式,中间有一个或运算为”true“,也就结束运算或最后一个表达式与前面的或运算返回值为”true“也结束
#include <stdio.h>
int main()
{
int a = 0, b = 0, d = 3;
int i = a++ || b++ || d++;
printf("%d %d %d",a,b,d);
return 0;
}
#include <stdio.h>
int main()
{
int a = 0, b = 0, d = 0;
int i = a++ || b++ || d++;
printf("%d %d %d",a,b,d);
return 0;
}
如果左边的表达式为“true”,再计算右边表达式,如果为“false”,再进行或运算,返回值是”true“,就结束运算,后面的表达式不再计算,如果左边的表达式为“false”,再计算右边表达式,如果为“true”,再计算或运算,返回值是”true“,就结束运算,后面的表达式不再计算,
#include <stdio.h>
int main()
{
int a = 1, b = 0, d = 0;
int i = a++ || b++ || d++;
printf("%d %d %d",a,b,d);
return 0;
}
#include <stdio.h>
int main()
{
int a = 0, b = 1, d = 0;
int i = a++ || b++ || d++;
printf("%d %d %d",a,b,d);
return 0;
}
switch(表达式)
case value1: statement
case value1: statement
default: statemnet如果我们要计算一个数%3后的余数的话可以这样写
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int num1;
scanf("%d",&num1);
switch (num1 % 3)
{
case 0:
printf("余数是0\n");
case 1:
printf("余数是1\n");
case 2:
printf("余数是2\n");
}
return 0;
}一个数除以3之后取余数无非就是”0“”1“”2“这个三个数,所以就可以将这个三个数作为case的常量,当表达式返回的常量与case的常量匹配的时候就进入这个匹配的case语句里面

用1/3后取余数是1,所以从case的常量为1的情况进入相应的语句,但是输出好像把case的常量为2的语句也执行了,这是因为switch的表达式的结果只决定进入的入口,没有决定跳出语句的出口就会一直执行下去,直到执行完switch的所有语句,这个时候就要介绍我们的break,用于跳出语句
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int num1;
scanf("%d",&num1);
switch (num1 % 3)
{
case 0:
printf("余数是0\n");
break;
case 1:
printf("余数是1\n");
break;
case 2:
printf("余数是2\n");
break;
}
return 0;
}这个时候我们就可以输出正确的值了,每一个break对应相应的语句

并且case表达式的值必须为整型!!!switch后面必须为整形表达式!!!

如果我们要输入周几就会输出工作日或周末,那我们用钢才的方法或许太过冗余,我们说过了switch后面的表达式返回值是case的常量,那我们用工作日或者周末的所对应的日期来完成进入语句,那就只需要一个break跳出语句了
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int day;
scanf("%d",&day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("周末");
}
return 0;
}此时我们输入对应的日期就会返回相应的语句
当我们的条件不匹配case的所有常量的时候我们就需要用到default,用于处理case不匹配的问题,default可以位于switch的任何位置,但是不能随意放置!!!
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int day;
scanf("%d",&day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("周末");
default:
printf("请输入1到7的数字");
}
return 0;
}若没有输入1到7的数字就会执行default里面的语句
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int day;
scanf("%d",&day);
switch (day)
{
case 1:
case 2:
default:
printf("请输入1到7的数字");
break;
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("周末");
}
return 0;
}这儿时候我将default放在case 2:后面,当我输入1或者2的时候就会进入default,导致逻辑错误,所以建议default一般放在语句最后面
