Redian新闻
>
为什么 2 < 3 ? : 100 的结果是 1?

为什么 2 < 3 ? : 100 的结果是 1?

公众号新闻

Linux内核里面很多这样的写法

特别是这个代码

讲真,这样的代码在我们这里是会被叼的,好好的代码你不写,你非得写一个似懂非懂的意思。

err_out:
  err2 = sg_finish_rem_req(srp);
  sg_remove_request(sfp, srp);
  return err ? : err2 ? : count;

但是你有没有想过,如果等于,到底是多少呢?

我们先看下这个代码的汇编程序

#include <stdio.h>

int main()
{
  int a = 2;
  int b = 3;
  int c = a < b ? : 4;
  printf("%d\n",c);
  return 0;
}

汇编

 .file  "test23.c"
  .section .rodata
.LC0:
  .string  "%d\n"
  .text
  .globl main
  .type  main, @function
main:
.LFB0:
  .cfi_startproc
  pushq %rbp
  .cfi_def_cfa_offset 16
  .cfi_offset 6, -16
  movq %rsp, %rbp
  .cfi_def_cfa_register 6
  subq $16, %rsp
  movl $2, -12(%rbp)
  movl $3, -8(%rbp)
  movl -12(%rbp), %eax
  cmpl -8(%rbp), %eax
  setl  %al
  movzbl %al, %eax
  andl $1, %eax
  testb %al, %al
  je .L2
  movl -12(%rbp), %eax
  cmpl -8(%rbp), %eax
  setl  %al
  movzbl %al, %eax
  jmp .L3
.L2:
  movl $4, %eax
.L3:
  movl %eax, -4(%rbp)
  movl -4(%rbp), %eax
  movl %eax, %esi
  movl $.LC0, %edi
  movl $0, %eax
  call  printf
  movl $0, %eax
  leave
  .cfi_def_cfa 7, 8
  ret
  .cfi_endproc
.LFE0:
  .size main, .-main
  .ident "GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609"
  .section .note.GNU-stack,"",@progbits

编译脚本

gcc -E test23.c -o test23.i
gcc -S test23.i
gcc -S test23.i -o test23.s
gcc -c test23.s -o test23.o
gcc test23.o -o test23.out
chmod 777 test23.out
./test23.out

代码输出

qqqq@ubuntu:/study$ ./test23.sh 
1
qqqq@ubuntu:/study$

给关键的汇编代码加上注释

.file "test23.c"
  .section .rodata
.LC0:
  .string "%d\n"
  .text
  .globl main
  .type  main, @function
main:
.LFB0:
  .cfi_startproc
  pushq %rbp
  .cfi_def_cfa_offset 16
  .cfi_offset 6, -16
  movq %rsp, %rbp
  .cfi_def_cfa_register 6
  subq $16, %rsp
  movl $2, -12(%rbp) #给a 赋值2
  movl $3, -8(%rbp) #给b 赋值3
  movl -12(%rbp), %eax #给a 填充到 eax 寄存器
  cmpl -8(%rbp), %eax # 比较 b 和 a 的大小
  setl %al # 因为 a 小于 b 所以 al 置1
  movzbl %al, %eax # al 填充到 eal
        # 详解看这个 https://www.cnblogs.com/johnnyflute/p/3597352.html
  andl $1, %eax #按位与
  testb %al, %al #判断al 是否等于0,如果等于0,就跳转到 L2
  je .L2
  movl -12(%rbp), %eax
  cmpl -8(%rbp), %eax
  setl %al
  movzbl %al, %eax
  jmp .L3
.L2:
  movl $4, %eax # 输出4
.L3:
  movl %eax, -4(%rbp)
  movl -4(%rbp), %eax
  movl %eax, %esi
  movl $.LC0, %edi
  movl $0, %eax
  call printf
  movl $0, %eax
  leave
  .cfi_def_cfa 7, 8
  ret
  .cfi_endproc
.LFE0:
  .size main, .-main
  .ident "GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609"
  .section .note.GNU-stack,"",@progbits

我们稍微修改下代码,然后再看看汇编

#include <stdio.h>

int main()
{
  int a = 4;
  int b = 3;
  int c = a < b ? : 4;
  printf("%d\n",c);
  return 0;
}


代码输出

qqqq@ubuntu:/study$ ./test23.sh 
4
qqqq@ubuntu:/study$

通过比较发现汇编代码,只有一行不一样

关键的差异,就是在比较代码的位置,以比较结果看是否执行 setl %al

这也是为什么下面的代码结果是1的原因

我使用的GCC版本是

gcc (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


- EOF -



推荐阅读  点击标题可跳转

0、极客专属:几十款程序员秒懂的卫衣

1、大厂都病了!

2、曾经对程序员最好的公司,倒下了

3、时隔 20 年,这个编程语言再次“称王”!


关注「程序员的那些事」加星标,不错过圈内事

点赞和在看就是最大的支持❤️

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
有钱人妻妾成群,农村光棍成灾,这就是专家们想要的结果亿万富翁怒砸$100,000 要求飞机邻座妹子摘口罩!她最终摘了下来,他却更气……π的第100000000000000···全家感染:孩子已烧抽搐,家长无法自理,退烧药断供,这就是我们想要的结果?立足工农大众的新秧歌运动掀起面对道德绑架​张鸣:从“无奈”到欢喜,结果是我成了鲁迅迷危险!能否用智能AI写论文?可能性后果是什么?西人邻居偷闯后院,挖断电缆!澳华人很“心塞”!“大字报”床单,“砍树门”…邻里纠纷频发,“如果是白人,结果是否不同?”美国“新冠超级免疫者”又火了,结果是记者想搞个大新闻。“父母皆祸害”?为什么我们为孩子付出所有,却换来被子女视作“仇敌”的结局?刚刚官宣,突破121000000000000元!69买1送1?舒服到爆炸的桑蚕丝男士短裤,快给老公备上!《狂飙》大结局背后的故事:人生最坏的结果,不过是大器晚成天降“惊喜”: 蒙特利尔人在后院捡到$45000包裹, 结果是…如果您要独自去荒岛一星期,只能带一本书,您会带哪一本? 为什么?他预测了美国对华出口限制的结果!他预测了美对华限制的结果!ChatGPT飙升苹果商店榜首,每周订阅需7.99美元,结果是个假的???千万顶流的瓜?于正打压旗下艺人?锦鲤跳槽271?青岛贵妇接烂戏?女子用交友软件配对“阳光帅男”超心动 结果是“头号通缉犯”化烦恼为菩提 | 二十四、 一心想开悟的结果是什么?SGLT2抑制剂为什么能够治疗HFpEF?最新研究结果提供新见解丨ACC 2023巴西队回家了!专访 | 抖音ROI破50、直播GMV2.9亿+,鸭鸭羽绒服如何从亏损逆袭TOP1?真是急死人了…造娃养娃,才知道有这特殊医疗保险-美洋插队生活实录(十六)F-1入境递交I-485,拿到Combo卡后是否还需要F-1?|移投路群问答张文宏提醒第一波感染高峰来袭!多次感染的结果,和你想的不一样!《狂飙》张颂文告诉我:坚持热爱,最坏的结果不过是大器晚成“残疾已是非常好的结果”!澳华人女孩学滑翔伞坠地重伤,亲历濒死体验!微笑面对涅槃重生柴犬以为是出去玩,结果是去医院,表情瞬间垮掉:不跟你好了为什么?情侣吵架很正常,但这件事万万不能做!会让最坏的结果变成现实——针对“人本善”vs.“人本恶”,长达50年的实验研究告一段落;反转的结果,正如人性本如此外交政策:俄乌战争的结束并不意味着普京的结束大统华卖$14一只的苹果是什么来头?狗子嘴边沾了褐色异物,主人怕它误食巧克力,直接尝了尝,结果是屎哈哈
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。