所谓表达式就是指由运算符、运算量和标点符号组成的有效序列,其目的是说明一个计算过程。表达式可以独立成语句:表达式;
运算符按功能分为:算术运算、赋值运算、关系运算、逻辑运算、位运算以及其他运算符
1. 算术运算符:+ - * / % ++ –
(1)/:整数相除,向下取整。
int a=3/2;
float b=3/2;
float c=3.0/2;
float n1=3,n2=2;
printf("%d\n",a);//1
printf("%f\n",b);//1.000000
printf("%f\n",c);//1.50000
printf("%f\n",n1/n2);//1.50000
只针对于常量相除,不针对于变量相除。
(2)%:只能用于整数运算,取余
10%3=1
12%10=2
123%10=3
练习:将12345的个十百千万位分别输出到终端。
#include <stdio.h>
int main(int argc, char const *argv[])
{
int n=12345,g=0,s=0,b=0,q=0,w=0;
g=n%10;
s=n/10%10;
b=n/100%10;
q=n/1000%10;
w=n/10000;
printf("%d %d %d %d %d \n",w,q,b,s,g);
return 0;
}
(3)++:自增
int a=0;
a++;或者++a;
相当于a=a+1;
int a=1,b=1;
a++;//a=a+1
++b;//b=b+1
printf("%d %d\n",a,b);//2 2
(4)–:自减
a--;
--a;
a=a-1;
#include
int main(int argc, char const *argv[])
{
int a=1,b=1;
a--;//a=a-1
--b;//b=b-1
printf("%d %d\n",a,b);//0 0
return 0;
}
自加自减和打印结合🚨:++在前先++再打印,++在后先打印在++。
#include
int main(int argc, char const *argv[])
{
int a=1,b=1;
printf("%d\n",a++); //打印1 相当于:printf("%d\n",a);a++;
printf("%d\n",a); //打印2
printf("%d\n",++b); //打印2 相当于:b++;printf("%d\n",b);
return 0;
}
2. 赋值运算:= += -+ *= /= %=
int a=1,b=0;
(1)b=a++; //先赋值,再自加
先当于:b=a;a++;
(2)b=++a; //先自加,再赋值。
相当于:a++;b=a;
int a=1,b=0;
//b=++a;//结果会得2
b=a++;
printf("%d",b);//结果得1
例如:z=++x+y++;
相当于:x=x+1;z=x+y;y=y+1;
(3)a+=2;
相当于:a=a+2;
练习:
#include
int main(int argc, char *argv[])
{
int a = 10;
int b = a++; //b=10 a=11
int c = a + b;//c=21
int d = (b++) +c;// d=10+21
printf("d =%d \n",d);//d=31
return 0;
}
练习:
#include
int main(int argc, char *argv[])
{
int a = 10;
int b = ++a; //b=11 a=11
int c = a + (b++); //a=11 b=12 c=22
int d = b + c; //d=12+22=34
printf("%d\n", d);
return 0;
}
运算符 | 名称 | 示例 | 功能 | 缩写 |
< | 小于 | a | a小于b时返回真,否则返回假。 | LT |
<= | 小于等于 | a<=b | a小于等于b时返回真,否则返回假。 | LE |
> | 大于 | a>b | a大于b时返回真,否则返回假。 | GT |
>= | 大于等于 | a>=b | a大于等于b时返回真,否则返回假。 | GE |
== | 等于 | a==b | a等于b时返回真,否则返回假。 | EQ |
!= | 不等于 | a!=b | a不等于b时返回真,否则返回假。 | NE |
例子:
#include
int main()
{
int a=2,b=3;
printf("%d\n",a>b);
printf("%d\n",100%10!=0);
return 0;
}
3.逻辑运算符:&& || !
3.1 &&(逻辑与)
全真则真,一假则假。
全都是真的才是真,只要有假就是假。
3.2 ||(逻辑或)
一真则真,全假则假。
只要有真就是真,全都是假才是假。
3.3 !(逻辑非)
非真为假,非假为真。
例子:
#include
int main()
{
int a=2,b=3;
printf("%d\n",a>b); //0
printf("%d\n",100%10!=0); //0
printf("%d\n",(a<0)||(a>3));//0
printf("%d\n",!(a>b));//1
return 0;
}
3.4 截断法则🚨
逻辑或||运算中:如果前面表达式为真,则后面的表达式不执行。
逻辑与&&运算中:如果前面表达式为假,则后面的表达式不执行。
练习:
#include
int main()
{
int a=5,b=6,c=7,d=8,m=2,n=2;
int r=(m=a<b)||(n=c>d);
printf("%d %d %d",m,n,r);//1 2 1
}
#include
int main()
{
int a=5,b=6,c=7,d=8,m=2,n=2;
int r=(m=a>b)&&(n=c>d);
printf("%d %d %d",m,n,r);//0 2 0
}
4 .位运算符:& | ~ ^ << >>
含义 | C语言 |
按位与 | a&b |
按位或 | a|b |
按位异或 | a^b |
按位取反 | ~a |
左移 | a< |
右移 | a>>b |
无符号右移 | / |
负数都是用反码进行运算的
4.1 位与 &
全1则1,有0则0.
例如:
1111 0101
& 1010 1111
1010 0101
4.2 位或 |
有1则1,全0为0。
例如:
1111 0101
| 0101 0011
1111 0111
4.3 异或^
不同为1,相同为0。
例如:
1111 0101
^ 1111 1101
0000 1000
4.4 取反 ~
按位取反,0变成1,1变成0。
原码 反码 补码
正数: 本身 本身 本身
负数: 本身 除了符号位不变其他位按位取反 反码+1
~15
正数15:0000 1111
~15:11110000
~-1:
原码: 1000 0001
反码: 1111 1110
补码=反码+1: 1111 1111
~(-1):0000 0000
~ -5:
原码:1000 0101
反码:1111 1010
补码:1111 1011
~(-5):0000 0100
4.5 << 左移
左移几位,右边补几个零。
8<<2: 0000 1000<<2==>0010 0000
-5<<3:
原码:1000 0101
反码:1111 1010
补码:1111 1011
<<3: 1101 1000
1101 0111
1010 1000 = -40
负数补码求原码:先减一,再符号位不变然后按位取反。
4.6 >> 右移
右移几位,左边补几个符号位(即正数补0负数补1)。
8>>2 :
0000 1000>>2 :0000 0010=2
4.7 置一公式和置零公式
置一公式:a|(1<<n)
置零公式:a&(~(1<<n))
例子:
#include
int main()
{
int a=0b0111;
printf("%d\n",a|(1<<3));//15
printf("%d\n",a&(~(1<<2)));//3
return 0;
}
5. 特殊运算符
5.1 三目运算符
表达式:表达式1?表达式2:表达式3
先求解表达式1,若其值为真则执行表达式2,表达式2的返回值作为整体的取值。否则将表达式3的值作为整体的取值。
#include
int main()
{
int a=10,b=6,max=0;
max=(a>b)?a:b;
printf("%d\n",max);
return 0;
}
练习:判断以下打印结果
int num1 = 10, num2 = 20;
int res = num1 > num2 ? num1++ : num2++;
printf("num1=%d num2=%d res=%d\n", num1, num2, res);//10 21 20
5.2 sizeof( )**
用来计算数据所占空间大小的运算符。
格式:sizeof(数据类型或者变量名);
#include
int main()
{
int a = 10;
double d=1.5;
char c='a';
printf("%d\n", sizeof(int));//4
printf("%d\n", sizeof(a));//4
printf("%d\n", sizeof(d));//8
printf("%d\n", sizeof(c));//1
return 0;
}
6 .优先级
口诀📢: 单算移关与,异或逻条赋,从右向左单条赋
小练习1:实现大小写字母转换
#include
int main(int argc, char const *argv[])
{
char ch = getchar();
if (ch >= 'A' && ch <= 'Z')
ch += 32;
else if (ch >= 'a' && ch <= 'z')
ch -= 32;
else
printf("input error:\n");
putchar(ch);
putchar(10);
return 0;
}
小练习2:结合宏定义和三目运算符实现求两个数的差
#include
/*方式1.三目运算符结合宏 */
#define M 30
#define N 50
#define DIFF M>N?M-N:N-M
/*方式2.三目运算符结合宏函数 */
#define DIFF_FUN(A,B) A>B?A-B:B-A
int main(int argc, char const *argv[])
{
printf("%d\n",DIFF);
printf("%d\n",DIFF_FUN(7,1));//调用宏函数
}
小练习3:给出一个年份,判断是平年还是闰年。如果是润年打印1,平年打印0。
(思路:判断闰年还是平年,闰年且闰年二月份以上比平年多一天。普通年份除以4,有余数是平年,对于整百的年份,比如2100年,要除以400,有余数就是平年,整除就是闰年。)
思路,可以设置一个标志flag来接收平年还是闰年。然后用逻辑运算去判断平年还是闰年。最后打印flag。
#include
int main(int argc, char const *argv[])
{
int year=0,leap=1;
scanf("%d",&year);
leap=(year%4==0 && year%100!=0 || year%400==0);
printf("闰年为1,平年为0:%d\n",leap);
return 0;
}
t *argv[])
{
printf(“%d\n”,DIFF);
printf(“%d\n”,DIFF_FUN(7,1));//调用宏函数
}
小练习3:给出一个年份,判断是平年还是闰年。如果是润年打印1,平年打印0。
*(思路:判断闰年还是平年,闰年且闰年二月份以上比平年多一天。普通年份除以4,有余数是平年,对于整百的年份,比如2100年,要除以400,有余数就是平年,整除就是闰年。)*
思路,可以设置一个标志flag来接收平年还是闰年。然后用逻辑运算去判断平年还是闰年。最后打印flag。
```c
#include
int main(int argc, char const *argv[])
{
int year=0,leap=1;
scanf("%d",&year);
leap=(year%4==0 && year%100!=0 || year%400==0);
printf("闰年为1,平年为0:%d\n",leap);
return 0;
}