------运算符与表达式
目录
一.基本算数运算符:
| 运算符 | 含义 | 举例 | 结果 |
|---|---|---|---|
| + | 正号运算符(单目运算符) | +a | a的值 |
| - | 负号运算符(单目运算符) | -a | a的算数负值 |
| * | 乘法运算符 | a*b | a和b的乘积 |
| / | 除法运算符 | a/b | a除以b的商 |
| % | 求余运算符 | a%b | a除以b的余数 |
| + | 加法运算符 | a+b | a和b的和 |
| - | 减法运算符 | a-b | a和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;
}
该博客详细介绍了C语言的运算符与表达式,包括基本算数、自增自减、强制转换类型、赋值、逻辑等运算符,还说明了各运算符的格式、使用方法及优先级。此外,通过具体题目展示了逻辑表达式和条件运算符的应用,并布置了相关作业。
263

被折叠的 条评论
为什么被折叠?



