c语言运算符与表达式

217 阅读5分钟

**

运算符和表达式

** 所谓表达式就是指由运算符、运算量和标点符号组成的有效序列,其目的是说明一个计算过程。表达式可以独立成语句: 表达式; 运算符按功能分为:算术运算、赋值运算、关系运算、逻辑运算、位运算以及其他运算符

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 <stdio.h>
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 <stdio.h>
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;

例子1:

#include <stdio.h>
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;
}

例子2:

#include <stdio.h>
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);   //d=34
    return 0;
}

3. 关系运算:> >= < <= == !=

用来判断两者得关系,返回真或者假。 在这里插入图片描述

例子:

#include <stdio.h>
int main()
{
    int a=2,b=3;
    printf("%d\n",a>b);
    printf("%d\n",100%10!=0);
    return 0;
}

4.逻辑运算符:&& || !

4.1 &&(逻辑与)

全真则真,一假则假。 全都是真的才是真,只要有假就是假。

4.2 ||(逻辑或)

一真则真,全假则假。 只要有真就是真,全都是假才是假。

4.3 !(逻辑非)

非真为假,非假为真。 例子:

#include <stdio.h>
int main()
{
    int a=2,b=3;
    printf("%d\n",a>b); //0
    printf("%d\n",100%10!=0); //0
    printf("%d\n",(b>0)&&(b<6));//1
    printf("%d\n",(a<0)||(a>3));//0
    printf("%d\n",!(a>b));//1
    return 0;
}

4.4 截断法则

逻辑或||运算中:如果前面表达式为真,则后面的表达式不执行。 逻辑与&&运算中:如果前面表达式为假,则后面的表达式不执行。 例子1:

#include <stdio.h>
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
}

例子2:

#include <stdio.h>
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
}

5 位运算符:& | ~ ^ << >>

负数都是用反码进行运算的。 在这里插入图片描述

5.1 位与 &

全1则1,有0则0. 例如:

a:1111 0101 b:1010 1111 a&b: 1010 0101

5.2 位或 |

有1则1,全0为0。 例如:

a:1111 0101 b: 0101 0011 a|b: 1111 0111

5.3 异或^

不同为1,相同为0。 例如:

a: 1111 0101 b: 1111 1101 a^b: 0000 1000

5.4 取反 ~

按位取反,0变成1,1变成0。 在这里插入图片描述 例子: (1)~15 正数15:0000 1111 ~15:11110000

(2)~-1: 原码: 1000 0001 反码: 1111 1110 补码=反码+1:1111 1111 ~(-1):0000 0000

(3)~ -5: 原码:1000 0101 反码:1111 1010 补码:1111 1011 ~(-5):0000 0100

5.5 << 左移

左移几位,右边补几个零。

例子: (1)8<<2: 1000<<2==>100000 (2) -5<<3: -5求补码 原码:1000 0101 反码:1111 1010 补码:1111 1011 <<3: 1101 1000 左移3位结束后,反求其原码 1101 0111 1010 1000 = -40 负数补码求原码:先减一,再符号位不变然后按位取反。

5.6 >> 右移

右移几位,左边补几个符号位,正数补0负数补1。 例子: 8>>2 : 0000 1000>>2 :0000 0010=2

5.7 置一公式和置零公式

置一公式:a|(1<<n) 置零公式:a&(~(1<<n)) 例子:

#include <stdio.h>
int main()
{
    int a=0b0111;
    printf("%d\n",a|(1<<3));
    printf("%d\n",a&(~(1<<2)));
    return 0;
}

6 特殊运算符

6.1 三目运算符

(条件判断运算符)表达式:表达式1?表达式2:表达式3 先求解表达式1,若其值为真则执行表达式2,表达式2的返回值作为整体的取值。否则将表达式3的值作为整体的取值。

#include <stdio.h>
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

6.2 sizeof()

用来计算数据所占空间大小的运算符。 格式:sizeof(数据类型或者变量名);

#include <stdio.h>
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;
}

8 优先级 记忆口诀: 单算移关与 异或逻条赋 从右向左单条赋 在这里插入图片描述