操作符
:又叫运算符
。在写代码时候,?定会涉及到计算。C语?中为了?便运算,提供了?系列操作符。顾名思义:进行计算操作时要用到的符号。
分别是:
+
(加)
-
(减)
*
(乘)
/
(除)
%
(取余数),这些操作符同时又是双?操作符
(即计算时有2
个操作数进行计算)
//举个栗子
int a = 4 + 22; // a为 26
int b = 6 - 4; // b为 2
int c = 2 * 3 ;// c为 6
float d = 6.0 / 4;//d为 1.500000 注意:操作数是否为小数
int e = 6 % 4;//e为2 注意:操作数要为整数,e的符号由第一个操作数符号决定
赋值操作符 :=
是?个随时可以给变量赋值的操作符
//举个栗子
int a = 100;//创建一个变量时给的一个值,叫初始化
a = 200;//再给一个值叫赋值,这?使?的就是赋值操作符
a = 100 + 300;//赋值
//C语?中提供了复合赋值符,?便我们编写代码
// += -= *= /=
a += 1;//相当于 a = a + 1;
a -= 1;//相当于 a = a - 1;
a *= 1;//相当于 a = a * 1;
单?操作符:
++
、--
、+
、-
就是运算的时候就一个操作数
++
是?种?增的操作符,?分为前置++
和后置++
--
是?种?减的操作符,也分为前置--
和后置--
前置 计算?诀:
先加1或减1,后使用
后置 计算?诀:
先使用 ,后加1或减1
//举个栗子
//前置++
int a = 10;
int b = ++a;// a先加1,a=11; 再使用 进行赋值操作,b=11
printf("a=%d b=%d\n",a , b);//a=11,b=11
//后置++
int a = 10;
int b = a++;//a先使用 先进行赋值操作 b=10; 后加1 a=a+1 a=11
printf("a=%d b=%d\n",a , b);//a=11,b=10
//后置-- 前置-- 同理
在操作符中还有?种特殊的操作符是强制类型转换,语法形式很简单,形式如下:
(类型)
//举个栗子
int a = (int)3.14;
//将3.14强制类型转换为int类型,这种强制类型转换只取整数部分
// 俗话说,强扭的?不甜,在使?强制类型转换都是万不得已的时候使?
C 语??于
?较
的表达式,称为 “关系表达式”,??使?的运算符就称为“关系运算符”(relational operator),主要有下?6个 :
>
?于运算符
<
?于运算符
>=
?于等于运算符
<=
?于等于运算符
==
相等运算符
!=
不相等运算符
//举个栗子
int a = 1;
int b = 2;
//关系表达式通常返回 0 或 1 ,表?真假。
printf("a > b \n"); //输出 0
printf("a < b \n"); //输出 1
printf("a >= b \n");//输出 0
printf("a <= b \n");//输出 1
printf("a == b \n");//输出 0 , 注意:相等运算符 == 与赋值运算符 = 是两个不?样的运算符,不要混淆。
printf("a != b \n");//输出 1
条件操作符也叫三?操作符,需要接受三个操作数的
形式如:exp1 ?
exp2 :
exp3
条件操作符的计算逻辑是:如果 exp1 为真, exp2 计算的结果是整个表达式的结果;如果exp1 为假, exp3 计算的结果是整个表达式的结果。
//举个栗子
int a = 6;
int b = 0;
b = a>5 ? 3:-3;//a=6 大于 5,则执行exp2, b=3
printf("%d\n", b);//输出 3
逻辑运算符提供逻辑判断功能,?于构建更复杂的表达式,主要有下?三个运算符。
!
:逻辑取反运算符(改变单个表达式的真假)。
&&
:与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
||
:或运算符,就是或者的意思(两侧?少有?个表达式为真,则为真,否则为假)。
注:C语言中,?0表示真,0表示假
//举个栗子
int flag = 0;
if(!flag)// !flag 对flag进行取反,!0 = 1; 1为真,就进入if语句
{
printf("do something\n");//输出 do something
}
int month = 4;
if(month >= 3 && month <= 5)//4>=3,4<=5; 都为真,进入if语句
{
printf("春季\n");
}
month = 6
if(month >= 3 && month <= 5)//6>=3 为真,6<=5 为假; &&操作 有假则假,不进入if语句
{
printf("春季\n");
}
month = 1;
if(month == 12 || month==1 || month == 2)//对于 ||运算,有真则真 则进入if语句
{
printf("冬季\n");
}
练习:闰年的判断
输??个年份year,判断year是否是闰年
闰年判断的规则:
- 能被4整除并且不能被100整除是闰年
- 能被400整除是闰年
//举个栗子
#include<stdio.h>
int main()
{
int year = 0;
scanf("%d", &year);
if((year%4==0 && year%100!=0) || (year%400==0))
{
printf("是闰年\n");
}
return 0;
}
短路
C语?逻辑运算符还有?个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是保证的
如果左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路
”。
对于&&操作符来说,左边操作数的结果是0的时候,右边操作数就不再执?。
if(0 >= 3 && 3 <= 5) // 0 >= 3为假 就无需执行3 <= 5,&&操作符 全真才为真
if(4 >= 3 && 6 <= 5) // 4 >= 3为真 就无需执行6 <= 5,|| 操作符 有真就为真
//举个栗子 相信自己
#include <stdio.h>
int main()
{
int i = 0,a = 0,b = 2,c = 3,d = 4;
i = a++ && ++b && d++;
//i = a++||++b||d++;
printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);//a=1,b=2,c=3,d=4
return 0;
}
if 语句的语法形式如下:
if ( 表达式 )
{
语句
}
表达式成?(为真),则语句执?,表达式不成?(为假),则语句不执?
在C语?中,0为假,?0表?真
例?:输??个整数,判断是否为奇数
//举个栗子
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if(num % 2 == 1)
printf("%d 是奇数\n", num);
return 0;
}
如果?个数不是奇数,那就是偶数了,如果任意?个整数,我们要清楚的判断是奇数还是偶数怎么表示呢?
这?就需要 if…else… 语句了,语法形式如下:
if ( 表达式 )
{
语句1
}
else
{
语句2
}
注意
:
默认在 if 和 else 语句中默认都只控制?条语句
一条语句可省略大括号,多条语句则不能省
else 与最近的一个if 匹配
例?:输??个整数,判断是否为奇数,如果是奇数打印是奇数,否则打印数偶数。
//举个栗子
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if(num % 2 == 1)
{
printf("%d 是奇数\n", num);
}
else
{
printf("%d 是偶数\n", num);
}
return 0;
}
完成更多复杂逻辑的判断
练习
输??个?的年龄
如果年龄<18岁,打印"少年"
如果年龄在18岁?44岁打印"?年"
如果年龄在45岁?59岁打印"中年"
如果年龄在60岁?89岁打印"?年"
如果90岁以上打印"长寿"
//举个栗子
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age<18)
printf("少年\n");
else if(age<=44)
printf("?年\n");
else if(age<=59)
printf("中?年\n");
else if(age<=90)
printf("?年\n");
else
printf("长寿\n");
return 0;
}
除了 if 语句外,C语?还提供了 switch 语句来实现分?结构。
switch
语句是?种特殊形式的 if…else 结构,?于判断条件有多个结果的情况。它把多重
的 else if 改成更易用、可读性更好的形式。
switch (expression)
{
case value1: statement
case value2: statement
default: statement
}
注意:
? switch 后的 expression 必须是整型
表达式
? case 后的值,必须是整形常量
表达式
练习:
输??个1~7的数字,打印对应的星期几
例如:
输?:1 输出:星期?
输?:2 输出:星期?
输?:3 输出:星期三
输?:4 输出:星期四
输?:5 输出:星期五
输?:6 输出:星期六
输?:7 输出:星期天
//举个栗子
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch(day)
{
case 1:
printf("星期?\n");
break;
case 2:
printf("星期?\n");
break;
case 3:
printf("星期三\n");
break;
case 4:
printf("星期四\n");
break;
case 5:
printf("星期五\n");
break;
case 6:
printf("星期六\n");
break;
case 7:
printf("星期天\n");
break;
}
return 0;
}
在使? switch 语句的时候,我们经常可能遇到?种情况,?如 switch 后的表达式中的值?法匹配代码中的 case 语句
的时候,这时候要不就不做处理,要不就得在 switch 语句中加?default
?句。
//举个栗子
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch(day)
{
case 1:
printf("星期?\n");
break;
case 2:
printf("星期?\n");
break;
case 3:
printf("星期三\n");
break;
case 4:
printf("星期四\n");
break;
case 5:
printf("星期五\n");
break;
case 6:
printf("星期六\n");
break;
case 7:
printf("星期天\n");
break;
default:
printf("输?错误\n");
break;
}
return 0;
}
指: 如果某?个 case 语句的后边没有 break 语句
,代码会继续
执行下去,有可能执行其他 case语句中的代码,直到遇到 break 语句或者 switch 语句结束
//举个栗子
#include <stdio.h>
int main()
{
int n = 0;
switch(n%3)
{
case 0:
printf("整除,余数为0\n");
case 1:
printf("余数是1\n");
case 2:
printf("余数是2\n");
}
//输出
//整除,余数为0
//余数是1
//余数是2
return 0;
}
for 循环是三种循环中使?最多的, for 循环的语法形式如下:
for(表达式1
;表达式2
;表达式3
)
{
语句
;
}
表达式1
用于循环变量的初始化
表达式2
用于循环结束条件的判断
表达式3
用于循环变量的调整
练习1:
计算1~100之间3的倍数的数字之和
//举个栗子
#include <stdio.h>
int main()
{
int i = 0;
int sum = 0;
for(i=1; i<=100; i++)
{
if(i % 3 == 0)
sum += i;
}
printf("%d\n", sum);
return 0;
}
while 语句的语法结构和 if 语句?常相似。
while(表达式
)
{
语句
;
}
注意
: 循环的变量更新要接近判断条件
,否则一不小心写成死循环
练习:
输??个正的整数,逆序打印这个整数的每?位
例如:
输?:1234,输出:4 3 2 1
输?:521,输出:1 2 5
//举个栗子
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
while(n)
{
printf("%d ", n%10);
n /= 10;//不断接近循环的判断条件
}
return 0;
}
语法格式:
do
{
语句
;
}while(表达式
);
while 和 for 这两种循环都是先判断
,条件如果满?就进?循环,就执?循环语句
,如果不满?就跳出循环
? do while 循环则是先直接进?循环体
,再执?循环语句
,然后再执? while 后的判断表达式,表达式为真,就会进?下?次,表达式为假,则不再继续循环。所以至少执行了一次循环.
练习
输??个正整数,计算这个整数是?位数?
例如:
输?:1234 输出:4
输?:12 输出:2
//举个栗子
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
int cnt = 0;
do
{
cnt++;
n = n / 10;
} while (n);//最少也是一位数
printf("%d\n", cnt);
return 0;
}
break ?于终?循环的
。不管循环还需要循环多少次,只要执?到了 break ,循环就彻底终?。
continue 是继续的意思
。在循环中的作?就是跳过本次循环中 continue 后边的代码,继续进?下?次循环的判断。
练习
找出100~200之间的素数,并打印在屏幕上。
注:素数?称质数,只能被1和本?整除的数字。
//举个栗子
#include <stdio.h>
int main()
{
int i = 0;
//循环产?100~300的数字
for(i=100; i<=300; i++)
{
//判断i是否为素数
//循环产?2~i-1之间的数字--->这里还可以改进的
int j = 0;
int flag = 1;//假设i是素数
for(j=2; j<i; j++)
{
if(i % j == 0)
{
flag = 0;
break;
}
}
if(flag == 1)
printf("%d ", i);
}
return 0;
}
C语?提供了?种?常特别的语法,就是 goto 语句和跳转标号, goto 语句可以实现在同?个函数内
跳转到设置好的标号处。
//举个栗子
#include <stdio.h>
int main()
{
printf("hehe\n");
goto next;
printf("haha\n");
next:
printf("跳过了haha的打印\n");
return 0;
}
在多层循环的代码中,如果想快速跳出使? goto 就?常的?便了。
//举个栗子
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
void menu() {
printf("-----欢迎来到猜数游戏-----\n");
printf("--------1:开始游戏------\n");
printf("--------0:结束游戏------\n");
printf("--------请选择: ------\n");
}
void game() {
int num = rand()%100+1;//生成要猜测的随机数
int guess = 0;
int count = 5;
printf("数字的范围是1~100哦,共有5次机会\n");
while (count)
{
printf("请输入你猜的数字吧:");
scanf("%d", &guess);
printf("\n");
if (guess == num)
{
printf("恭喜你,猜对了 ^_^\n");
break;
}
else if(guess<num)
{
printf("猜小了哦 亲 *_* \n");
}
else
{
printf("猜大了哦 亲 *_* \n");
}
count--;
}
if (count==0)
{
printf("很遗憾,你没猜对!数字是:%d\n",num);
}
}
int main() {
int choose = 0;
srand((unsigned int)time(NULL));//随机数种子不断随时间变化
do {
menu();
scanf("%d", &choose);
switch (choose)
{
case 1:
game();
break;
case 0:
break;
default:
printf("输入选项有误,请重新输入!\n");
break;
}
} while (choose);
return 0;
}