大多数编程语言都是以处理数据为中心的,无论什么语言对数据做处理,运算符都是必不可少的,下面我们来看一下C语言中的运算符都有哪些。

运算符

运算符有很多,我们可以按照其类别的方式去记忆他们,这样相对简单一些,不过也不必刻意记忆,这些我们平时用的多了自然就记住了。那接下来我们先进行分个类。

赋值运算符: =
算术运算符: =、-、*
关系运算符: <、>、>=、<=、==、!=
逻辑运算符: !、&&、|
位运算符 : ~、&、|、<<、>>、^
逗号运算符: ,
求大小运算符: sizeof

  • 单目运算符:例如负号(-),取地址符
  • 双目运算符:例如加号(+),大于号(>)
  • 三目运算符:只有一个就是?

这只是运算符中的一部分,剩下的我们后续慢慢了解。

赋值运算符

基本使用:
赋值符号"="就是复制运算符,而不是表示相等的意思。
通用形式:
变量名 = 表达式;

我们需要注意的是,赋值号左边的是一个可以被赋值的变量,右边是要赋给它的值,所以int a = 100;10 = a;是错的。

我们来几个例子:

int Num = 100;
int Num1 = 0;        
Num1 = Num;        //这里我们就把Num的值赋值给了Num1

连续赋值:

int a,b,c;
c = 10;
a = b = c;
//这里先将c的值赋给b,然后将b的值赋值给a

算术运算符

一元运算符:-(符号)、++(自增)、--(自减)
二元运算符:+(加)、-(减)、*(乘)、/(除)、%(取模)

我们首先介绍一下二元运算符,二元运算符都是我们常见的运算符,但是有两个符号我们在这里多啰嗦两句。

"/":-13.2 得到的结果是-6

   15/3.0    得到的结果是5.0
   10/-4.0    得到的结果是-2.5

规则: 1.整数相除,结果只能得到整数部分。

       2.要想得到小数部分,运算需要浮点数的参与。
       3.运算结果的符号余除数与被除数有关系。

"%":-13%2 得到的结果是-1

 13%-2    得到的结果是1

规则:1.取模运算符的两个操作数必须是整数,不能是浮点数

     2.运算结果的符号仅与被除数有关。

接下来是自增(++),自减(--)运算符:

当自增的同时还参与运算的时候,++放后面,会先参与运算,再自增。
当自增的同时还参与运算的时候,++放前面,会先自增,再参与运算。
自减规律和自增相同

int main()
{
    int Num = 10;
    int Num = 0;
    Num2 = Num++;    //先赋值,再自增。
    printf("%d\n",Num2);
    Num2 = ++Num;    //先自增,再赋值
    printf("%d\n",Num2);
    return 0;
}

结果是:10,12。

赋值运算与算术运算连用

赋值运算符于算术运算符可以连用,成为符合运算:

  • +=,a+=1相当于a=a+1
  • -=,a-=1相当于a=a-1
  • *=,a*=1相当于a=a*1
  • /=,a/=1相当于a=a/1
  • %=,a%=1相当于a=a%1
  • ...

一些不太明显运算我们来解释一下例如

int a = 100;
int b = 20;
a /= b+10;
//这里最后会变形为a = a/(b+10);优先运算=右边的。

逗号运算符

逗号运算符一般没有太大作用,就是起到了一个分割的作用。
我们需要了解的是逗号运算符的优先级最低以及以下一个例子

int a = 0,b = 0;
a = 1,2,3,4,5;
b = (6,7,8,9);
//最终的结果是a是1,b是9

sizeof运算符

sizeof运算符是个特殊的运算符,他能够得到某一特数据或者数据类型所占用的内存大小(以字节为单位)。
因为能够得到某一个数据或者数据类型的大小,所以sizeof中可以写数据类型,也可以写变量名。

int main()
{
    int nNum = 0;
    char cCha = 0;
    double fNum = 0;
    printf("int 型占用的大小为:%d\n",sizeof(int));
    printf("nNum 型占用的大小为:%d\n",sizeof(nNum));
    printf("char 型占用的大小为:%d\n",sizeof(char));
    printf("cCha 型占用的大小为:%d\n",sizeof(cCha));
    printf("double 型占用的大小为:%d\n",sizeof(double));
    printf("fNum 型占用的大小为:%d\n",sizeof(fNum));
    return 0;
}

最后结果是:int 4 ,nNum 4,char 1,cCha 1,double 8,fNum 8;

表达式

C语言中的表达式,是若干个运算符于数据合在一起的算式,例如:
100,10+5,a+10,(a*100+1)/2,a=0
无论是简单的式子,还是复杂的式子,表达式组中都是有一个值的,以下是常见的简单表达式,他们组成的复杂运算的基础。

  • 常量表达式:100,单个常量也是表达式
  • 赋值表达式:a = 10,等号左边必须是一个可修改的值
  • 算术表达式:a += 10,先运算a+10,然后将结果赋值给a
  • 关系表达式:a>b,判断a和b的大小关系
  • 逻辑表达式:a&&b,这个计算结果只可能是1或0
  • 函数表达式:fun(),得到函数的返回值

一个式子中有多个运算符,那么可以称之为符合表达式,例如(100+a*100)/2>10

语句

语句是C语言的基本组成单位,语句的结尾用一个分号标识,一个表达式加上一个分号就是一个语句,表达式也有可能是语句的一部分。

int main()
{
    int b;
    scanf_s("%d",&a);
    if(a>0)
    {
        b = a%10;
        printf("你输入了一个大于0的数,它的个位是%d",b);
    }
    return 0;
}

这例子中,if后面的两条语句称之为符合语句,当然main函数下面在大括号之间的也是复合语句。

类型转换

自动类型转换
自动类型转换的情况有两种:
1.当一个算术表达式中为不同类型的变量的时候,会进行自动类型转换。
char -> short -> int -> long -> float -> double
2.进行赋值运算的时候,会将右值类型自动转换为左值,有可能会都是数据。

int i = 10;
float c = 2.5;
i = i/c;
//i/c为4.000,i先自动转成float进行计算,结果再转成"="左侧的类型。最终i的值是4。

强制类型转换
通过使用转换可以将一个表达式强制转换为某一种类型,语法是:(变量类型)变量

float  b = 13.44;
int a = (int)b;
//将float类型强转为int类型

运算符的优先级与结合性

在一个表达式中,不可避免的会出现多个运算符,先计算那个是我们需要关注的问题,因为数学计算中,先后顺序对结果的影响非常大,在我们刚接触数学的时候,我们就知道先乘除,后加减,在C语言中也有类似规则,这个规则称为优先级。
一个表达式中,先计算优先级高的运算符,然后计算优先级的运算符。
如果遇到了相同优先级的情况,这个时候还会有个结合性。

例如:-8*4%2-3

  • 一元运算符优先级最高 -8
  • *与%优先级相同,因为是做结合的,所以先计算 -84=-32
  • -32%2 = 0
  • 0-3 = -3

在比如:
1+2+3,我们先计算1+2然后得到的结果再加3
b=c=10,这个式子中,先计算c=10,然后对b赋值

但其实我们,一般我们不需要大量时间去记忆优先级问题,如果我们以后写的时候遇到这个问题,我们以直接使用括号搞定,但使用括号的时候我们需要注意:

  • 先计算括号内的内容
  • 在括号中嵌套括号(()),这样的情况,最里层最先执行
  • 包含多个括号的表达式从左向右进行计算

最后我们强调一点:括号的优先级最高,逗号的优先级最低

最后修改:2020 年 08 月 26 日
如果觉得我的文章对你有用,请随意赞赏