C语言第三次培训

该博客详细介绍了C语言的运算符与表达式,包括基本算数、自增自减、强制转换类型、赋值、逻辑等运算符,还说明了各运算符的格式、使用方法及优先级。此外,通过具体题目展示了逻辑表达式和条件运算符的应用,并布置了相关作业。

------运算符与表达式

目录

------运算符与表达式

一.基本算数运算符:

二.自增自减运算符:

自增:++

自减:--

++i,--i:在使用i之前,先使a的值加(减)1

i++,i--:在使用i之后,使a的值加(减)1

三.强制转换类型运算符:

格式:(类型)(表达式)

四.赋值运算符:

五.逻辑运算符及其表达式:

if {}else{}语句:

格式:

if{}else if{}else{}:

六.条件运算符和条件表达式:

格式:结果+条件 ?元素1(表达式):元素2(表达式)

七.C语言运算符优先级:

1.(后缀运算符)

2.(一元运算符)

3.(乘除运算符)

4.(加减运算符)

5.(位移运算符)

6.(关系运算符)

7.(相等运算符)

8.(位运算符)

9.(位运算符)

10.(位运算符)

11.(逻辑运算符)

12.(逻辑运算符)

13.(条件运算符)

14.(赋值运算符)

15.(逗号运算符)

八.作业:


一.基本算数运算符:

运算符含义举例结果
+正号运算符(单目运算符)+aa的值
-负号运算符(单目运算符)-aa的算数负值
*乘法运算符a*ba和b的乘积
/除法运算符a/ba除以b的商
%求余运算符a%ba除以b的余数
+加法运算符a+ba和b的和
-减法运算符a-ba和b的差

注意精度优先原则:几个类型做算数运算,结果会是最精准那个类型;例:a为int类型,b为float类型,两者相加结果为float类型。

二.自增自减运算符:

自增:++
自减:--
++i,--i:在使用i之前,先使a的值加(减)1
i++,i--:在使用i之后,使a的值加(减)1
 /*代码讲解*/
 #include <stdio.h>
     
 int main()
 {
     int x=3, y, z;
     printf("x = %d\n", x);
     y = x++;//等价于分为两步,y = x;x = x + 1;
     printf("y = %d\n", y);
     printf("x = %d\n", x);
     z = ++x;//等价于分为两步,x = x + 1;z = x;
     printf("z = %d\n", z);
     printf("x = %d\n", x);
     return 0;
 }
 ​
 /*代码输出:
 x = 3
 y = 3
 x = 4
 z = 5
 x = 5
 ​
 */

三.强制转换类型运算符:

格式:(类型)(表达式)
 /*代码实例*/
 #include <stdio.h>
     
 int main()
 {
     int x = 1;
     char y = '2';
     float z = 3.14;
     printf("%.2f\n", (float)x);//将int类型的x强制转换为float类型
     printf("%d\n", (int)y);//将char类型的y强制转换为int类型
     printf("%.2lf\n", (double)x+(double)z);//将int类型的x,float类型的z强制转换为double类型,并计算两者之和
     printf("%d\n", (int)((double)x+(double)z));
     //在上面的基础上,再将它们的和强制转换为int类型;注意不能(int)(double)x+(double)z这样写,要加括号,因为和是一个整体
     return 0;
 }
 ​
 /*代码输出:
 1.00
 50
 4,14
 4
 ​
 */

四.赋值运算符:

赋值符号“=”就是赋值运算符,例:

 int x = 3;

就是执行一直赋值操作,将3赋值给变量x,当然,我们也可以将表达式的值赋值给变量。

在此基础上,我们就可以使用“复合赋值运算符”

 /*代码实例*/
 #include <stdio.h>
     
 int main()
 {
     int a = 1, b = 2, c = 7;
     a += a;//等价于a = a + a;
     b -= 1;//等价于b = b - 1;
     c /= a;//等价于c = c / a;
     printf("a = %d\n", a);
     printf("b = %d\n", b);
     printf("c = %d\n", c);
     return 0;
 }
 ​
 /*代码输出:
 a = 2
 b = 1
 c = 3
 ​
 */

在此基础上,我们加上表达式

 /*代码实例*/
 #include <stdio.h>
 ​
 int main()
 {
     int a = 1, b = 2, c = 7;
     float d = 2.33;
     int x;
     int m=7, n=3, q;
     a *= (a+2);//等价于a = a*(a+2);注意右边表达式默认加括号,所以我们可以不加括号 a *= a+2;
     x = a;
     b = x = x+3;//等价于分两步走,x = x + 3;b = x;右值运算:从右往左运行代码 
     c %= m-n+(q=-1);//等价于分二步走,q = -1;c = c % (m-n+q);
     d /= (float)m/n;//等价于 d = d / (float)m/n; 所以在赋值时可以强制转换 
     printf("a = %d\n", a);
     printf("b = %d\n", b);
     printf("x = %d\n", x);
     printf("c = %d\n", c);
     printf("d = %.2f\n", d);
     return 0;
 }
 ​
 /*代码输出:
 a = 3
 b = 6
 x = 6
 c = 1
 d = 1.00
 ​
 */

五.逻辑运算符及其表达式:

在讲逻辑表达式前,我们先讲选择语句中的if语句:

现在有这样一个题:

输入a,b的值,如果a>b,则交换a,b的值,否则不交换;

如果让你用C语言的知识,该如何解决这个问题?

此时我们便需要用到if语句:

 /*代码讲解*/
 #include <stdio.h>
 ​
 int main()
 {
     int a, b, t;
     scanf("%d %d", &a, &b);
     if(a > b)
     {
         t = a;
         a = b;
         b = t;
     }
     else//如果仔细理解代码,你会发现else是多余的
     {
         a = a;
         b = b;
     }
     printf("a = %d\nb = %d", a, b);
     return 0;
 }
if {}else{}语句:
格式:
 
if(条件)
 {
     运行语句;
     运行语句;
 }
 else
 {
     运行语句;
     运行语句;
 }

如果在此题的基础上增加难度:

输入迟到次数,迟到1次或以下100分;迟到1次以上,3次一下80分,迟到3次以上60分;

此时if{}else{}语句已经不能满足我们的要求,我们便需要使用if{}else if{}else{}语句:

if{}else if{}else{}:
 
/*代码讲解*/
 #include <stdio.h>
 ​
 int main()
 {
     int n, coure;
     scanf("%d", &n);
     if(n <= 1)
     {
         coure = 100;
     }
     else if(n <= 3)
     {
          coure = 80;
     }
     else
     {
         coure = 60;
     }
     printf("coure = %d", coure);
     return 0;
 }

此时我们便完成了题目的要求,但是仔细看代码你会发现代码有问题,如果我们输入负数呢?或者我要更加精确迟到的范围从而获得不同的分数呢?程序便不能满足我们的要求。

此时我们便需要逻辑表达式:

逻辑运算符

了解完逻辑运算符我们便可以完善代码

 
/*代码讲解*/
 #include <stdio.h>
 ​
 int main()
 {
     int n, coure;
     scanf("%d", &n);
     if(n < 0)
     {
         printf("输入错误\n");
     }
     else if(n > =0 && n <= 1)
     {
         coure = 100;
         printf("coure = %d\n", coure);
     }
     else if(n <= 3)//等价于(n>1 && n<=3)
     {
          coure = 80;
          printf("coure = %d\n", coure);
     }
     else if(n <= 5)//等价于(n>3 && n<=5)
     {
          coure = 60;
          printf("coure = %d\n", coure);
     }
     else
     {
         coure = 0;
         printf("coure = %d\n", coure);
     }
     return 0;
 }

六.条件运算符和条件表达式:

设想如果有这样一个题:

输入整数a,b的值,输出max的值。

正常情况下我们会这样想:

 
#include <stdio.h>
 ​
 int main()
 {
     int a, b, max;
     scanf("%d%d", &a, &b);
     if(a > b)//不加花括号默认执行后面一个语句
         max = a;
     else//不加花括号默认执行后面一个语句
         max = b;
     printf("max = %d", max);
     return 0;
 }

虽然能够解决问题,但是代码太多,浪费我们的时间,所以我们采用使用条件运算符:

格式:结果+条件 ?元素1(表达式):元素2(表达式)
 /*代码讲解*/
 #include <stdio.h>
 ​
 int main()
 {
     int a, b, max;
     scanf("%d%d", &a, &b);
     max=(a>b)?a:b;//等价于上面的四排代码
     printf("max = %d", max);
     return 0;
 }

如果你想代码更加简洁,我们还可以这样:

 
/*代码讲解*/
 #include <stdio.h>
 ​
 int main()
 {
     int a, b, max;
     scanf("%d%d", &a, &b);
     max=(a>b)? printf("max = %d", a) : printf("max = %d", b);
     return 0;
 }

七.C语言运算符优先级:

1.(后缀运算符)
运算符名称
[]数组下标
()圆括号
.成员选择
->成员选择

结合方向从左到右

2.(一元运算符)
运算符名称
-负号
++自增
--自减
*取值(指针)
&取地址
逻辑非
(类型)强制转换类型
sizeof求长度
~按位取反

结合方向从右到左

 //按位取反,简单来说加一添负号  
     // x = -(x+1) 
     int a = 1, b = 200, c = 3000;
     printf("%d %d %d\n", ~a, ~b, ~c);
     /*
     -2 -201 -3001
     */

3.(乘除运算符)
运算符名称
/
*
%取余

结合方向从左到右

4.(加减运算符)
运算符名称
+
-

结合方向从左到右

5.(位移运算符)
运算符名称
<<左移
>>右移

结合方向从左到右

 //左移很简单的来说,把当前的二进制,整体往左边移动N个单位,得到一个新的二进制 
     //左移就是n*2^m 
     //低位补0 
     printf("%d\n", 5<<2);
     /*
     20
     */
     
     //右移很简单的来说,把当前的二进制,整体往右边移动N个单位,得到一个新的二进制 
     //高位补0 
     printf("%d\n", 5>>2);

6.(关系运算符)
运算符名称
>大于
>=大于等于
<小于
<=小于等于

结合方向从左到右

7.(相等运算符)
运算符名称
==等于
!=不等于

结合方向从左到右

8.(位运算符)
运算符名称
&按位与

结合方向从左到右

二进制位,两个均为1的取1,剩下的取0

9.(位运算符)
运算符名称
^按位异或

结合方向从左到右

二进制位,相同的为0,不同的为1

10.(位运算符)
运算符名称
|按位或

结合方向从左到右

二进制位,有含1的取1,全为0的取0

11.(逻辑运算符)
运算符名称
&&逻辑与
(采用短路运算):如果前面一个运算式返回为0,则后面的运算式不运算

结合方向从左到右

12.(逻辑运算符)
运算符名称
||逻辑或
(采用短路运算):如果前面一个运算式返回为1,则后面的运算式不运算

结合方向从左到右

13.(条件运算符)
运算符名称
?:条件运算符

结合方向从右到左

14.(赋值运算符)
运算符名称
=赋值
/=除后赋值
*=乘后赋值
%=取模后赋值
+=加后赋值
-=减后赋值
<<=左移后赋值
>>=右移后赋值
&=按位与后赋值
^=按位异或后赋值
|=按位或后赋值

结合方向从右到左

15.(逗号运算符)
运算符名称
逗号表达式

结合方向从左到右

八.作业:

1.设计程序实现输入整数a,b,c的值,按从小到大的顺序输出(拓展从大到小,想写的话自己写,思路是一样的);

2.设计程序实现输入一个字母,如果为大写则输出小写,如果为小写则输出大写。

3.设计程序实现输入a, b , c的值,求解二元一次方程ax2 + bx + c = 0, 若有解则输出两个解x1和x2,无解则输出no answer。

 
/*1.思路一*/
 #include<stdio.h>
 ​
 int main()
 {
     int a, b, c, t;
     printf("please input three int a,b,c:\n");
     scanf("%d%d%d", &a, &b, &c);
     if(a > b)
     {
         t = a;
         a = b;
         b = t;
     } 
     if(b > c)
     {
         t = b;
         b = c;
         c = t;
     }
     if( a > c)
     {
         t = a;
         a = c;
         c = t;
     }
     if(a > b)
     {
         t = a;
         a = b;
         b = t;
     }
     printf("three sored int :\n%d %d %d\n", a, b, c);
     return 0;
 }

 /*1.思路二*/
 #include<stdio.h>
 ​
 int main()
 {
     int a, b, c;
     int max, mid, min;
     printf("please input three int a,b,c:\n");
     scanf("%d%d%d",&a, &b, &c);
     max = (a>b) ? a : b;
     max = (max>c) ? max : c;
     min = (a>b) ? b : a;
     min = (min>c) ? c : min;
     mid = a + b + c - max - min;
     printf("three sored int :\n%d %d %d\n", min, mid, max);
     return 0;
 }

 
/*2.思路一*/
 #include <stdio.h>
 ​
 int main()
 {
     int x = getchar();//char x = getchar();也可以
     //putchar(x);
     if(x >= 'a' && x <= 'z')
     {
         x = x - 32;
         //printf("%c", x);
         putchar(x);
     }
     else if(x >= 'A' && x <= 'Z')
     {
         x = x + 32;
         //printf("%c", x);
         putchar(x);
     }
     else
     {
         printf("输入错误\n"); 
     }
     return 0;
 }

 
/*2.思路二*/
 #include <stdio.h>
 ​
 int main()
 {
     int x = getchar();//char x = getchar();也可以
     if((x >= 'a' && x <= 'z') || (x >= 'A' && x <= 'Z'))
     {
         x = (x >= 'a' && x <= 'z') ? x-32 : x+32;
         putchar(x);
     }
     else
         printf("输入错误\n");
     return 0;
 }

 #include <stdio.h>
 #include <math.h>
 ​
 int main() {
     float a, b, c, derta, x1, x2;
     scanf("%f\n%f\n%f", &a, &b, &c);
     derta = sqrt(b*b - 4*a*c);
     if(derta >= 0)
     {
         x1 = (-b + derta)/2*a;
         x2 = (-b - derta)/2*a;
         printf("x1 = %.2f\n", x1);
         printf("x2 = %.2f\n", x2);
     }
     else
         printf("no answer!\n");
     return 0;
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值