C语言从零开始(七)-其他运算符

一,关系运算符

1. 关系运算符

关系运算符的作用是比较符号两边的元素

> 大于
>= 大于等于
< 小于
<= 小于等于
== 等于
!= 不等于

关系运算符都是双目运算符,其结合性均为左结合。关系运算符的优先级低于算术运算符,高于赋值运算符。也就是说,在一个没有括号的关系运算表达式中,<、<=、>、>=要先于==和!=发挥作用。相同级别的预算符从左向右计算。

2. 关系表达式

关系表达式的一般形式为:

表达式  关系运算符  表达式

例如:

a + b > c - d
x > 3 / 2
‘a’ + 1 < c
-i - 5 * j == k + 1

也允许出现嵌套的情况。

例如:

a > (b > c)
a != (c == d)

关系表达式的值是“真”和“假”,用“1”和“0”表示。如:
5 > 0的值为“真”,即为1;
(a = 3) > (b = 5)由于不成立,故其值为假,即为0。

例如:

#include <stdio.h>

int main(){

    char c = 'k';
    int i = 1, j = 2, k = 3;
    float x = 3e + 5, y = 0.85;

    printf("%d, %d\n", 'a' + 5 < c, -i - 2 * j >= k + 1);
    printf("%d, %d\n", 1 < j < 5, x - 5.25 <= x + y);
    printf("%d, %d\n", i + j + k == -2 * j, k == j == i + 5);

    return 0;
}
  • 字符变量以它对应的ASCII码参与运算
  • 对于含多个关系运算符的表达式,如k == j == i + 5,根据运算符的左结合性,先计算k == j,该式不成立,其值为0,再计算0 == i + 5,也不成立,故表达式值为0。

是不是有点晕,如果你要参加考试,请仔细研究一下。如果你只是为了能自己写出好的程序,不用搞懂这么多,值需要知道:

表达式为真,值为1。表达式为假,值为0

需要注意的是,C语言中经常用0代表假,非零代表真。遇到了我们再说。

二,逻辑运算符

逻辑运算符相当于数学中的(且、或、非),我们叫做“逻辑与”、“逻辑或”和“逻辑非”。

&& 逻辑与
|| 逻辑或
! 逻辑非

前两个是双目运算符,最后一个是单目预算符。

我们看一段代码:

int main()
{
    int a = 5 > 3; // 表示真
    int b = 5 < 3; // 表示假

    int x = a && a;
    int y = a && b;
    int z = b && b;
    printf("x = %d, y = %d, z = %d\n", x, y, z);

    x = a || a;
    y = a || b;
    z = b || b;
    printf("x = %d, y = %d, z = %d\n", x, y, z);

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

    return 0;
}

先看下这段代码的运行结果:

运行结果

简单说就是这样:

逻辑与:两边都为真时返回真,否则返回假;
逻辑或:只要任意一个为真就返回真,否则返回假;
逻辑非:符号右边是真,则返回假;符号右边是假,则返回真。

请仔细对照程序理解。

三,按位运算符

C语言和其它高级语言不同的是它完全支持按位运算符。这与汇编语言的位操作有些相似。

按位运算符有:

& 位逻辑与
| 位逻辑或
^ 位逻辑异或
- 位逻辑反
>> 右移
<< 左移

这部分涉及一点点汇编语言知识,不具体介绍了。有问题的同学可以私下讨论。

需要说几个特殊的应用。

1. 不申请第三个变量数值交换

这个问题经常在面试中考,就是如何在不使用第三个变量的情况下完成两个变量的数值交换。看这段代码:

int a = 1;
int b = 2;

a = a ^ b;
b = a ^ b;
a = a ^ b;

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

大家自己去验证一下结果。

2. 最高效的乘2和除2

int a = 10;
int b = a * 2;
int c = a / 2;

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

这段代码大家肯定能看懂,但它还有另外一种效率更高的表达方式:

int a = 10;
int b = a << 1;
int c = a >> 1;

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

因为位运算得到了更多的底层优化,因此同样的功能它的效率更高。在嵌入式开发中,这种方式是被人们推崇的,因为资源有限。其他领域,人们更多地还是使用前面的方法,因为代码可读性更佳。

说远了,这些大家了解就好。

四. 特殊运算符

1. "?"运算符

"?"运算符是一个三目运算符, 其一般形式是:

<表达式1>?<表达式2>:<表达式3>;

含义:

先求表达式1的值,如果为真,则求表达式2 的值并把它作为整个表达式的值;如果表达式1的值为假,则求表达式3的值并把它作为整个表达式的值。

请看下面这段代码:

int main()
{
    int x, y, z;
    x = 50;
    y = x > 70 ? 100 : 0;
    printf("y = %d\n", y);

    x = 80;
    z = x > 70 ? 100 :0;
    printf("z = %d\n", z);

    return 0;
}

运行结果为:

运行结果

仔细思考一下这个例子。后面我们会讲到的if ... else ... 的部分功能可以用这个表达式替代。

2. ","运算符

","运算符用于将多个表达式串在一起, ","运算符的左边总不返回,右边表达式的值才是整个表达式的值。

举个例子:

int main()
{
    int x, y;
    x = 50;
    y = (x -= 5, x / 5);

    printf("%d", y);

    return 0;
}

这段代码的打印结果是9. 因为x的初始值为50, 减5后变为45, 45除5为9赋给y。

这个知识点常被忽略,所以被各种考试青睐。其实在真正编程中很少使用。

3. sizeof运算符

sizeof运算符是一个单目运算符, 它返回变量或类型的字节长度。

例如:

sizeof(double) // 8
sizeof(int) // 2

也可以求变量的大小, 例如:

float f;
int a = sizeof(f);

则a的值将为4。

这个预算付可以理解为一个函数,在计算结构体大小时很有用。后面会讲到。

五,C运算符的优先级

当一个表达式中有多个运算符参加运算时,将按下表所规定的优先级进行运算。表中优先级从上往下逐渐降低,同一行优先级相同。

C运算符的优先次序(1最高, 16最低)

  1. ()(小括号) [](数组下标) .(结构成员) ->(指针型结构成员)
  2. !(逻辑非) .(位取反) -(负号) ++(加1) --(减1) &(变量地址)
  3. *(指针所指内容) type(函数说明) sizeof(长度计算)
  4. *(乘) /(除) %(取模)
  5. +(加) -(减)
  6. <<(位左移) >>(位右移)
  7. <(小于) <=(小于等于) >(大于) >=(大于等于)
  8. ==(等于) !=(不等于)
  9. &(位与)
  10. ^(位异或)
  11. |(位或)
  12. &&(逻辑与)
  13. ||(逻辑或)
  14. ?:(?表达式)
  15. = += -=(联合操作)
  16. ,(逗号运算符)

这个部分教材上有大量练习题,请大家去练习一下。尤其是准备考等级考试的同学。

今天就到这里。其实这部分如果细说还有很多小点,我们这里主要抓取大的脉络,具体还需要大家学习教材,有什么问题欢迎探讨。

我是天花板,让我们一起在软件开发中自我迭代。
如有任何问题,欢迎与我联系。


上一篇:C语言从零开始(六)-运算符与类型转换
下一篇:C语言从零开始(八)-标准输入输出

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,980评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,422评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,130评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,553评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,408评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,326评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,720评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,373评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,678评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,722评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,486评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,335评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,738评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,283评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,692评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,893评论 2 335

推荐阅读更多精彩内容