聊一聊“三目运算符”为什么存在

目录

一、引例 - 牛客网OJ题

二、代码

解法一 

解法二

三、知识点

 三目操作符的初步介绍

三目运算符的书写

四、谈一谈三目运算符的兴衰

Python中为什么不引入三目运算符

五、总结


 


 

 

一、引例 - 牛客网OJ题

 为了更好地说明这个问题,我们以一道牛客网的题目作引例。题目链接贴在这里

牛牛的金币_牛客题霸_牛客网牛牛尝试在蒙住眼睛的情况下拿到旁边的金币,假设的坐标是 (x,y) ,金币的坐标是 (x1。题目来自【牛客题霸】https://www.nowcoder.com/practice/35d8e3e569dc49f2a1018d1dc9186998?tpId=290&tqId=2368477&ru=/exam/oj&qru=/ta/beginner-programmers/question-ranking&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E8%25AF%25AD%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D290

题干如下

696fd1b74ed84d0b90a0eb680fe538b4.png

 

题目本身并不难,但需要一点耐心,来将各个情况分析清楚。因为由题目可知,|x1 - x2|+|y1 - y2|=1始终成立(且坐标是整数),而且虽然牛牛的坐标在变化,但是x1 与 x的相对距离始终不变,所以我们不妨假设妞妞始终在原点解决问题。当我们明确此再回到“|x1 - x2|+|y1 - y2|=1始终成立(且坐标是整数)”时,我们可以发现,x1 和y1 的绝对值一定是1,也就是说x1 与y1 的取值只能是1 和 -1。

于是我们便可以画一张图来帮助我们解题:

64c4e36780fc48d0947a1dd0c07f7e21.jpeg

于是我们便有了以下解法:

二、代码

  1. 解法一 

#include <stdio.h>
int main() {
    int x,y;
    int x1,y1;
    scanf("%d%d",&x,&y);
    scanf("%d%d",&x1,&y1);
    if((x1-x)!=0)
    {
        if(x1-x>0)
        printf("r");
        else
         printf("l");
    }
    if(y1-y!=0)
    {
    if(y1-y>0)
        printf("u");
        else
         printf("d");
    }
    return 0;
}

以上代码使用了多次if 语句 看起来十分臃肿和丑陋,那么我们该怎样才能让代码变得更加简洁美观呢?于是我们想到了if 语句的精装版——“三目操作符”!

解法二

int main()
{
    int x,y,x1,y1;
    scanf("%d %d",&x,&y);
    scanf("%d %d",&x1,&y1);
    if (x1==x)
        y1>y?printf("u"):printf("d");
    else
        x1>x?printf("r"):printf("l");
    return 0;
}

这样看来是不是美观不少,也精致不少?可能,诸位看到这里会有些奇怪。啊?!三目操作符还能这么写!哈哈哈,要知道,这个才是发明三目运算符的初衷。

三、知识点

 三目操作符的初步介绍

  三目运算符,又称条件运算符,是计算机语言(C,C++,Java等)的重要组成部分。它是唯一有 3 个操作数的运算符,所以有时又称为三元运算符,其实三目运算符和 if / else 条件判断类似。

三目运算符的书写

//三目运算符
<表达式1> ? <表达式2> : <表达式3>;

四、谈一谈三目运算符的兴衰

一开始,在学习三目运算符的时候,总是很困惑——为什么明明有了 if ...else...语句为什么还要有一个三目运算符?像Python就直接在设计之初就没有引入,为什么C语言还仍然保留,功能没有if ...else...强大不说,使用的频率也很少很少,三目运算符这不是多此一举吗。后来,我才知道,在设计之初,他们设计的目的是不同的,而三目运算符的设计本身就体现了编程语言的设计美学!

众所周知,C语言的发明者丹尼斯·麦卡利斯泰尔·里奇,是个土生土长的美国人。

1a15776461c7460b9bab1ed044eb1827.png

 

在英语环境里成长的他在设计C语言必须面临的一个问题就是——“词语的变格”。也将是我们常说的名词复数、三单变化等.......在中文环境的我们似乎没有这个问题,不管单复数总是同样的,可以直接打印,但是英语人士的丹尼斯不得不考虑变格中加“s”、加“ed”等各种变格,于是基于此便发明了我们熟悉的三目运算符。

比方说,我们要买梨子(pear),我们买梨子的数量就决定了在打印时是否带“s”。

诚然!我们可以用if...else...语句

#include<stdio.h>
int main()
{
	int pear;
	scanf("%d",&pear);
	printf("%d pear",pear);
	if(pear>1)
    printf("s"); 
    else printf(" ");
	return 0;
}

或者像这样:

#include<stdio.h>
int main()
{
	int pear;
	scanf("%d",&pear);
	printf("%d pear",pear);
	if(pear>1)printf("s");else printf(" ");
	return 0;
}

是不是不太习惯,而且if 与else在同行并不符合我们的阅读代码的习惯,而且,要知道if...else...语句是非常常见的,当我们使用if 语句打印,看到全篇的if 语句后期寻找错误时,早就晕了!在无形中增加了我们代码报错的风险和后期维护的难度!

但是我们使用三目运算符呢?

#include<stdio.h>
int main()
{
	int pear;
	scanf("%d",&pear);
	printf("%d pear",pear);
	(pear>1)?printf("s"):printf(" ");
	return 0;
}

一行代码完成,节省了代码量,也让代码变得更加美观,所以说三目运算符的设计恰恰体现了C语言设计之初的设计美学。

Python中为什么不引入三目运算符

上文中我们提到了python语言中是没有引入三目运算符的,这究竟是为什么呢?有人说,python足够简单不需要三目运算符,if...else...语句已经取代了三目运算符。没错,确实如此,但原因其中原因之一。更重要的原因是,Python语言设计之初的理念——“解决问题的方式也可以只有一个!”

要理解“Python之禅”我们就要回到Python当时的设计环境中来,编程语言Perl曾在互联网领域长期占据着统治地位,早期的大多数交互式网站使用的都是Perl脚本。彼时,“解决问题的办法有多个”被Perl社区奉为座右铭。这种理念一度深受大家的喜爱,因为这种语言固有的灵活性使得大多数问题都有很多不同的解决之道。在开发项目期间,这种灵活性是可以接受的,但大家最终认识到,过于强调灵活性会导致大型项目难以维护:要通过研究代码搞清楚当时解决复杂问题的人是怎么想的,既困难又麻烦,还会耗费大量的时间。

经验丰富的程序员倡导尽可能避繁就简。Python社区的理念都包含在Tim Peters撰写的“Python之禅”中。要获悉这些有关编写优秀Python代码的指导原则,只需在解释器中执行命令import this。基于此理念,三目运算符的地位就很遗憾地被if...else...语句所取代。

五、总结

if...else...语句功能强大,他的作用像是前线征战的将士,负责将敌人杀伤殆尽。而三目运算符更像战士的妻子,负责打扫卫生、照顾家庭。在宏观意义上,打扫庭院确实没有杀敌报国伟大,确实一个贤惠的“妻子”起到了稳固军心的作用。可以锦上添花,在战斗时可以鼓舞士气,无形中让军队实力越来越强!

 

  • 63
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值