C语言入门教程-(6)运算符

1.运算符概述

运算符是一种编译器执行特定的数学或逻辑操作的符号。C语言提供了以下类型的运算符:

  • 算术运算符
  • 关系运算符
  • 逻辑运算符
  • 位运算符
  • 赋值运算符
  • 条件运算符
  • 其他运算符

2.算术运算符

算术运算符分为单目运算符和双目运算符,单目运算符表示只需要一个操作数,双目运算符需要两个操作数。

2.1 双目算术运算符

  • 1)+ :加法,把两个操作数相加
  • 2)- :减法,从第一个操作数中减去第二个操作数
  • 3)* :乘法,把两个操作数相乘
  • 4)/ :除法,第一个操作数除以第二个操作数
  • 5)% :求模(取余),第一个操作数除以第二个操作数所得余数

双目运算符中,C语言中的加号、减号与数学中的一样。乘号、除号因为ASCII符号中没有与数学中相对应的符号,所以使用星号表示乘号,使用斜线表示除号。C语言中增加了一个求模运算符,是用来取余的。需要注意的是,求模运算符的两个操作数必须是整型。

【实例6.1】加减乘除以及取模运算

#include <stdio.h>

int main(){    int a = 21;    int b = 10;    int c;    float d = 2.5;    double e;    int f = -21;    int g = -10;

    c = a + b;    printf(" a + b = %d\n", c);    c = a - b;    printf(" a - b = %d\n", c);    c = a * b;    printf(" a * b = %d\n", c);    c = a / b;    printf(" a / b = %d\n", c);    e = a / d;    printf(" a / d = %lf\n", e);    c = a % b;    printf(" a %% b = %d\n", c);    c = a % g;    printf(" a %% g = %d\n", c);    c = f % b;    printf(" f %% b = %d\n", c);    c = f % g;    printf(" f %% g = %d\n", c);

    return 0;}

执行以上程序,输出结果为:
a + b = 31
a - b = 11
a * b = 210
a / b = 2
a / d = 8.400000
a % b = 1
a % g = 1
f % b = -1
f % g = -1

实例解析:
加、减与数学中的一样,其中需要说明的是除法以及取模运算。C语言中的除法运算,不同类型的除数和被除数会导致不同类型的运算结果。一种情况是,当除数和被除数都是整数时,运算结果也是整数。当不能整除时,就直接舍弃小数部分,只保留整数部分。另一种情况是,一旦除数和被除数中有一个是小数,那么运算结果也是小数,并且是double类型的小数。C语言中的取余运算,就是求相除后的余数。取余运算中%的两边都必须是整数,不能出现小数,否则会报错。余数可以是正数也可以是负数,由%左边的整数决定:如果%左边是正数,那么余数也是正数;如果%左边是负数,那么余数也是负数。

2.2 单目算术运算符

  • 1)- :取负,把操作数乘以-1
  • 2)++:自增运算符,把操作数增加1
  • 3)--:自减运算符,把操作数减少1

单目运算符中,只需要一个操作数。取负操作符将正操作数设置为负数,负操作数设置为正数。自增运算符使得变量的值增加1,自减运算符使得变量的值减少1。比如:

i++;j--;

变量i的值增加1,变量j的值减少1,相当于:

i = i+1;j = j-1;

自增运算符和自减运算符的运算对象只能是变量,不能是常量或者表达式,否则将会报错。比如:

1++;//报错--(i+1);//报错

自增运算符和自减运算符分为两种方式:一种是在变量前面,称为前缀模式;一种是在变量后面,称为后缀模式。下面介绍一下两种方式的区别:

  • 前缀模式,先执行变量的自增或者自减操作,再将得到的结果参与表达式运算。
  • 后缀模式,先将变量参与表达式运算,再执行变量的自增或者自减操作。

前缀模式,也被理解为先运算后赋值,比如:

i = 1;j = ++i;

执行上面语句,i和j的值都是2。先是变量i自增,i的值变为2,再将结果2赋值给j。

后缀模式,也被理解为先赋值后运算,比如:

i = 1;j = i++;

执行上面语句,i的值是2,j的值是1。先是变量i赋值给j,这个时候i还没有自增操作,i的值还是1,所以j的值是1。赋值后,i再自增,i的值变为2。

【实例6.2】前缀模式和后缀模式

#include <stdio.h>

int main(){

    int a = 10;    int c;

    c = a++;

    printf("先赋值后运算:\n");    printf(" c 的值是 %d\n", c);    printf(" a 的值是 %d\n", a);

    a = 10;//重新赋值为10    c = a--;    printf(" c 的值是 %d\n", c);    printf(" a 的值是 %d\n", a);

    printf("先运算后赋值:\n");    a = 10;    c = ++a;    printf(" c 的值是 %d\n", c);    printf(" a 的值是 %d\n", a);

    a = 10;    c = --a;    printf(" c 的值是 %d\n", c);    printf(" a 的值是 %d\n", a);

}

执行以上程序,输出结果为:
先赋值后运算:
c 的值是 10
a 的值是 11
c 的值是 10
a 的值是 9
先运算后赋值:
c 的值是 11
a 的值是 11
c 的值是 9
a 的值是 9

实例解析:
++ 在变量前面和后面是有区别的:++ 在前面叫做前自增。前自增先进行自增运算,再进行其他操作。++ 在后面叫做后自增。后自增先进行其他操作,再进行自增运算。
对于,c = a++; a 的值不会立马加 1,而是先把 a 原来的值(也就是10)交给 c,然后再加 1。a 原来的值为 10,所以 c 的值也就为 10。而 a 经过自增,最终值为 11。
对于,c = a--; a 的值不会立马减 1,而是先把 a 原来的值(也就是10)交给 c,然后再减 1。a 原来的值为 10,所以 c 的值也就为 10。而 a 经过自减,最终值为 9。
对于,c = ++a,先执行 ++a,结果为 11,再将 11 赋值给 c,所以 c 的最终值为11。而 a 经过自增,最终的值也为 11。
对于,c = --a,先执行 --a,结果为 9,再将 9 赋值给 c,所以 c 的最终值为9。而 a 经过自减,最终的值也为 9。

2.3 算术运算符的优先级

在数学运算中,运算符是有优先级的,C语言中的运算符也有优先级。算术运算符的优先级:单目算术运算符(-、++、--) > 乘号(*)、除号(/)、求模(%) > 加号(+)、减号(-)。比如:

int a = 1 + 2 * 3;

根据优先级,将会先计算2 * 3,再将得到的结果6和1相加,得到7,赋值给变量a。

当表达式中有多个相同优先级的运算符时,按照从左到右的顺序运算。比如:

int a = 1 + 2 * 3 / 3;

乘号(*)、除号(/)优先级相同,按照从左到右的顺序运算,先计算2 * 3,将结果6 / 3,得到结果2和1相加,得到3,赋值给变量a。

如果需要改变表达式的运算顺序,我们还可以使用圆括号。比如:

int a = (1 + 2) * 3 / 3;

先计算圆括号内的1 + 2,得到的结果3再去运算,最后得到3,赋值给变量a。

3.关系运算符

  • 1)==:检查两个操作数的值是否相等,如果相等则条件为真。
  • 2)!=:检查两个操作数的值是否相等,如果不相等则条件为真。
  • 3)> :检查左操作数的值是否大于右操作数的值,如果是则条件为真。
  • 4)< :检查左操作数的值是否小于右操作数的值,如果是则条件为真。
  • 5)>=:检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。
  • 6)<=:检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。

关系运算符只有两种结果:true或者false。true代表条件为真,false代表条件为假。C语言中,一般非0值代表true,0代表false。比如:

1 == 2;//条件为假,结果是false。1 != 2;//条件为真,结果是true。1 > 2;//条件为假,结果是false。1 < 2;//条件为真,结果是true。1 >= 2;//条件为假,结果是false。1 <= 2;//条件为真,结果是true。

4.逻辑运算符

  • 1)! :单目运算符,称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。
  • 2)&&:双目运算符,称为逻辑与运算符。如果两个操作数都非零,则条件为真。
  • 3)||:双目运算符,称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。

逻辑运算符与数学上有相同之处。逻辑运算符和关系运算符一样,也只有两种结果:true或者false。逻辑运算符可以将多个关系表达式的结果合并起来。我们要判断变量i是否在0和100之间,不能直接表示成:0 =< i =< 100。需要使用逻辑运算符来表示,比如:

i >= 0 && i =< 100

如果变量i在0和100之间,则结果为true,否则为false。

逻辑运算符也是有优先级的,逻辑非运算符(!)>逻辑与运算符(&&)>逻辑或运算符(||)。

【实例6.3】逻辑运算符

#include <stdio.h>

int main(){    int a = 0, b = 1, c = 2, d = 3;

    printf("!a = %d\n", !a);    printf("!b = %d\n", !b);

    printf("a&&b = %d\n", a && b);    printf("a||b = %d\n", a || b);

    printf("a&&b||c&&d = %d\n", a&&b || c&&d);

    printf("a&&!b||c&&d = %d\n", a && !b || c&&d);

    return 0;}

执行以上程序,输出结果为:
!a = 1
!b = 0
a&&b = 0
a||b = 1
a&&b||c&&d = 1
a&&!b||c&&d = 1

实例解析:
在使用printf()函数以整数形式输出逻辑结果时,1代表true,0代表false。!a代表a取反,0取反结果为true,所以输出1。那么!b取反则输出0。a&&b代表a和b做与运算,0和1做与运算,结果为false,则输出0。a||b 代表a和b做或运算,0和1做或运算,结果为true,则输出1。a&&b || c&&d,根据优先级,我们先运算a&&b和c&&d,得到的结果是false和true,false和true进行或运算,结果还是true,所以输出1。a && !b || c&&d,根据优先级,我们先运算!b,得到的结果是false,然后运算a和false以及c&&d,得到的结果是,false和true进行或运算,结果是true,所以输出1。

5.位运算符

位运算符作用于位,并逐位执行操作,也就是二进制的运算。

  • 1)~ :单目运算符,按二进制位进行取反运算。
  • 2)& :双目运算符,按二进制位进行与运算。
  • 3)| :双目运算符,按二进制位进行或运算。
  • 4)^ :双目运算符,按二进制位进行异或运算。
  • 5)<<:双目运算符,二进制左移运算符。
  • 6)>>:双目运算符,二进制右移运算符。

位运算符不能用于float、double等类型,只能用于整数类型。

【实例6.4】位运算符

#include <stdio.h>

int main(){

    int a = 50;    /* 50 = 0011 0010 */    int b = 19;    /* 19 = 0001 0011 */    int c = 0;

    c = a & b;       /* 18 = 0001 0010 */    printf("a & b 的值是 %d\n", c);

    c = a | b;       /* 51 = 0011 0011 */    printf("a | b 的值是 %d\n", c);

    c = a ^ b;       /* 33 = 0010 0001 */    printf("a ^ b 的值是 %d\n", c);

    c = ~a;          /* -51 = 1100 1100 */    printf("~a 的值是 %d\n", c);

    c = a << 2;     /* 200 = 1100 1000 */    printf("a << 2 的值是 %d\n", c);

    c = a >> 2;     /* 12 = 0000 1100 */    printf("a >> 2 的值是 %d\n", c);

    return 0;}

执行以上程序,输出结果为:
a & b 的值是 18
a | b 的值是 51
a ^ b 的值是 33
~a 的值是 -51
a << 2 的值是 200
a >> 2 的值是 12

实例解析:
A = 50,B = 19,现在以二进制格式表示,它们如下所示:
A = 0011 0010
B = 0001 0011
然后按照二进制位进行相应运算得到结果值。二进制左移运算符,运算对象的各二进制位全部左移若干位,左边的二进制位丢弃,右边补0;二进制右移运算符,运算对象的的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。

6.赋值运算符

C语言中,可以将赋值运算符分为两类:简单赋值运算符和复合赋值运算符。

2.1 简单赋值运算符

简单赋值运算符就是"=",一般语法格式:

变量 = 表达式;

赋值运算符"="和数学表达式中的等号"="的意义是不同的。前面我们就多次用到了赋值运算符"="。"="的作用是把结果赋值给变量,所以赋值运算符的左边必须是变量,赋值运算符从右向左的顺序计算。比如:

a = b = 1; 

以上语句,先将1赋值给b,再将变量b赋值给变量a。

赋值也是一种运算,我们可以放在表达式中。比如:

a = (b = 1) + (c = 2);

以上语句,先将1赋值给b和将2赋值给c,再将变量b和c的值相加,最后得到的结果3赋值给a。

2.2 复合赋值运算符

  • 1)+=:加赋值,a += b等价于a = a + b。
  • 2)-=:减赋值,a -= b等价于a = a - b。
  • 3)*=:乘赋值,a *= b等价于a = a * b。
  • 4)/=:除赋值,a /= b等价于a = a / b。
  • 5)%=:取余赋值,a %= b等价于a = a % b。
  • 6)&=:位与赋值,a &= b等价于a = a & b。
  • 7)|=:位或赋值,a |= b等价于a = a | b。
  • 8)^=:位异或赋值,a ^= b等价于a = a ^ b。
  • 9)<<=:位左移赋值,a <<= b等价于a = a << b。
  • 10)>>=:位右移赋值,a >>= b等价于a = a >> b。

赋值运算的规则是将左侧的变量和右侧的操作数进行运算,然后再将得到的结果赋值给左侧的变量。比如:

a += 1;

等价于:

a = a + 1;

7.条件运算符

条件运算的一般语法格式如下:

表达式1?表达式2:表达式3

从语法格式中,我们可以看出,这是一个三目运算。通过问号和冒号将三个表达式连接起来。整个表达式的运算过程:先计算表达式1的值,如果它的值为true(非0值),则将表达式2的值返回;如果它的值为false(0值),则将表达式3的值返回。

【实例6.5】条件运算符,比较两个数的最大值

#include <stdio.h>

int main(){    int a, b, max;

    printf("Please input a:");    scanf("%d", &a);

    printf("Please input b:");    scanf("%d", &b);

    max = a > b ? a : b;

    printf("max is:%d\n",max);

    return 0;}

执行以上程序,输出结果为:
Please input a:5
Please input b:10
max is:10

实例解析:
先计算a > b,值为false,将b的值返回,结果为10。

8.其他运算符

  • 1)sizeof:长度运算符
  • 2)& :取地址运算符
  • 3)[]:下标运算符
  • 4)* :指针运算符
  • 5). :结构体成员运算符
  • 6)->:指向结构体成员运算符

这里介绍一下sizeof长度运算符,其余的在后面会讲到。sizeof运算符返回一个数据类型、变量、常量所占的字节长度,可以使用printf()函数来输出。

【实例6.6】sizeof长度运算符

#include <stdio.h>

int main(){    int a = 100;

    printf("int类型字节长度:%d\n", sizeof(int));    printf("变量a字节长度:%d\n", sizeof(a));    printf("常量100字节长度:%d\n", sizeof(100));

    return 0;}

执行以上程序,输出结果为:
int类型字节长度:4
变量a字节长度:4
常量100字节长度:4

实例解析:
可以看到结果都是4,这是因为int类型的字节长度是4,变量a的字节长度也就是4,存储的常量100自然也就是4。

9.总结

总结一下,本节内容主要介绍了C语言的算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、条件运算符和其他运算符。

10.练习

6-1 下面程序的输出结果是什么?

#include <stdio.h>

int main(){    int a = 12, b = 1;    int c = a - (b--);    int d = (++a) - (--b);    printf("c=%d, d=%d\n", c, d);

    return 0;}

6-2 判断下面结果是true还是flase:

1 > 1 && 3 < 4 || 4 > 5 && 2 > 1 && 9 > 8 || 7 < 6

! 2 > 1 and 3 < 4 or 4 > 5 and 2 > 1 and 9 > 8 or 7 < 6

6-3 编写一个程序,比较三个数的最大值。

可以在评论中,写下你们的练习答案。

之后的文章会给大家带来更精彩的内容
欢迎关注我的知乎专栏:程序员基础知识
获取练习答案以及更多实战项目
欢迎关注我的公众号:程序员基础知识
交(gao)流(ji)群:493584686

原文地址:https://www.cnblogs.com/cxyjczs/p/10234829.html

时间: 2024-08-30 07:47:52

C语言入门教程-(6)运算符的相关文章

哪有python开发语言入门教程免费下载?

人工智能时代,如果不想被机器人取代,最应该掌握的是编程.Python作为连续10年最受欢迎的编程语言,不但能开发Google .豆瓣等大型网站,还是人工智能领域的第一语言.那么,我猜你想问哪里有python开发语言入门教程. 千锋Python基础教程:http://pan.baidu.com/s/1qYTZiNE Python课程教学高手晋级视频总目录:http://pan.baidu.com/s/1hrXwY8k Python课程windows知识点:http://pan.baidu.com/

C语言入门教程-(5)格式化输入输出

1.输入和输出 在程序的使用中,我们经常可以看的这么一个场景:用户需要输入数据,经过程序运算,得到结果后输出.在C语言中,输入数据和输出数据都是由库函数完成的,通过语句来输入/输出. 2.格式化输出-printf()函数 C语言程序运算的结果在内存中,我们需要将其输出到指定设备中,我们才可以看到数据.printf是print format的缩写,意思是"格式化打印"."打印"的意思就是在屏幕上显示内容,所以我们称printf是格式化输出. 2.1 printf()函

C语言编程:一本全面的C语言入门教程(第三版)PDF下载

网盘下载地址:C语言编程:一本全面的C语言入门教程(第三版)PDF下载 – 易分享电子书PDF资源网 作者: (美)Stephen Kochan 出版社: 电子社博文视点资讯有限公司 译者: 张小潘 出版年: 2006年 页数: 543 页 定价: 59.00元 装帧: 平装 ISBN: 9787121007354 内容简介 · · · · · · 本书是极负盛名的C语言入门经典教材,其第一版发行至今已有20年的历史.本书内容详实全面,由浅入深,示例丰富,并在每个章节后面附有部分习题,非常适合读

HTML语言入门教程

HTML入门教程 什么是 HTML 语言         HTML(HyperText MarkUp language)是使用特殊标记来描述文档结构和表现形式的一种语言.(它可以用任何一种编译器编译,因为它就是一种纯文本文件) HTML是什么样的 HTML语法就是给文本加上表明文本含义的标签(Tag),让用户(人或者程序)能对文本得到更好的理解.下面是一个最简单的HTML文档:       所有的HTML文档都应该有一个<html>标签,<html>标签包括两个部分:<hea

Java语言入门教程

(一) Java言语入门教程Java类的组成一向很喜欢一句广告词:日子即是一个七天又一个七天.而我想说的 是,Java运用就是一个类又一个类.Java是面向目标的言语,目标都是由类实例化而来.一个Java运用,不管简略仍是杂乱,都是由若干个Java类 组成的.因而,关于初学者,先知道Java类的组成是必要的. Java类的组成首要有3有些:数据成员.结构办法.办法成员. 首要看下边的代码,是一个简略的Java类: package com.csst.vo; public class Custome

Swift入门教程:基本运算符

基本运算符 Swift所支持的基本运算符 赋值运算符:= 复合赋值运算符:+=.-= 算数运算符:+.-.*./ 求余运算符:% 自增.自减运算符:++.-- 比较运算符:==.!=.>.<.>=.<= 逻辑运算符:&&.||.! 三目运算符:? : 范围运算符:.. .... 赋值运算符 单对单赋值 var a = 5 let b = 20 多对多赋值 var (x, y) = (1, 2) // x的值是1,y的值是2 跟C\OC不一样的是:Swift的赋值运算

C语言入门教程-(4)常量和变量

1.常量和变量的概念 程序执行过程中其值不能发生改变的量叫做常量,其值能发生改变的量叫做变量.常量可以直接使用,而变量则必须先定义后才能使用,否则编译器会报错. 2.常量和变量的命名规范 在介绍常量和变量的命名规范之前,我们先了解一下什么是标识符和关键字. 1)标识符 标识符,用来标识符号常量名.变量名.函数名.数组名.文件名.类名.对象名等.简单的将就是大家取的名字~~有效标识符的构成规则如下: 1)第一个字符必须是字母(大小写都行)或下划线,不能是数字; 2)后跟字母(大小写都行).下划线或

Go语言入门教程(十一)

原创: IT干货栈 Hello,各位小伙伴大家好,我是小栈君,昨天讲了关于go语言的函数的定义和自定函数的部分种类,我们今天接着上期所讲的内容继续进行分享. 一.函数之无参有返回值 有返回值的函数,必须有明确的终止语句,否则会引发编译错误.所以在有返回值的函数中需要使用关键字 return . 他可以是一个或者多个返回值.官方建议:最好命名返回值,因为不命名返回值,虽然使得代码更加简洁了,但是会造成生成的文档可读性差. //方式1 func Test01() int { return 250 }

Perl语言入门--2--perl的运算符

一.算数运算符 **:是幂 结果不能超过数的范围 当指数为小数时 底数不能为负数 %:取余数  两边的操作数为整数,如果不是则要截取,把所有的小数部分去掉 注意:当一个字符串参加运算,需要转化为整数时,如果不能转化为整数则值为零, '2'+1=3   'a'+1=1 二.数字比较运算符 大于小于等于   :比较结果为真或非零 ,假或零 <=> : 比较运算   $a <=> $b 当a大于b时:值为1 当a小于b时:值为-1 当a等于b时:值为0 用这个运算符的时候,自动把操作数转