对一道if-else相关的程序题的简单分析(r5笔记第45天)

今天同事在微信群里提出了一个问题,看似是一个面试题。 大体的意思就是补充下面if条件使得输出 Hello World

if(){
System.out.print("Hello");
}
else{
System.out.println(" world");
}

乍一看这个题目就是类似脑筋急转弯之类的问题。一看就不可能实现,本来if-else之类的逻辑处理就会占据很多程序员的大部分工作,如果这都可行,那些逻辑处理感觉就不可靠了。 首先来简单分析一下这个问题,在程序的运行过程中,对于if-else基本是一个穿行的执行过程,if和else部分是互斥的关系。不可能达到并行执行的程度。 不过我们还是分析一下,看有没有什么突破口。 if部分需要执行,必须是一个true的条件,而else部分执行则也是一个true的条件。假设if中的条件为X 则需要证明X=!X 这种情况在Java中还没有这种逻辑结构。Java是强类型语言,对于数据类型也不会有模糊边界。 和数据库方面关联起来,Oracle中的Null似乎是一个对这种情况很好的补充,因为null值是真假之外的未知值,可以使用下面的几个简单sql语句来说明。 n1@TEST11G> select *from dual where ''=null; no rows selected n1@TEST11G> select *from dual where ''!=null; no rows selected n1@TEST11G> select *from dual where '' is null; D - X 1 row selected. n1@TEST11G> select *from dual where '' is not null; no rows selected 但是理论上能够说明,写pl/sql的时候还是比较纠结,不好实现,比如下面的pl/sql块中。 begin if '' = null then dbms_output.put_line('Hello '); else dbms_output.put_line('world'); end if; end; / 输出结果为 world 对于if 条件 ''=null却没法佐证对它的值取反得到的是未知值。 所以在这一点上,理论上还是可行的,但是目前还没有找到好的突破口来把真,假,未知的状态给结合起来。 这个时候我们来从程序本身看看有什么可以能做的事情,首先但从逻辑上硬扛是没有出路的。看来还得动点小脑筋。 我们可以在if中嵌入打印语句,直接输出Hello的部分,在else部分输出world。 首先我们结合System.out.println来输出下面的值。 System.out.println(System.out.printf("%s","Hello")==null); System.out.println(System.out.printf("%s","Hello")!=null); 得到的结果如下: Hellofalse Hellotrue 所以我们可以利用System.out.printf("%s","Hello")!=null来先输出Hello,只对if条件进行了验证,但是If中的实现没有调用,直接跳到了else部分。 所以最后的一种方法就是下面的样子。 if(System.out.printf("%s","Hello")==null){ System.out.print("Hello"); } else{ System.out.println(" world"); } 运行就能够输出Hello World 不过这个时候继续深究一下,我们调用的System.out.printf会输出一个PrintStream的对象,是不是只有printf可行呢,可以在Java源代码中查看相关的方法,可以看到append也是一个可行的方式,输出也是PrintStream类型。 所以使用append的方式也是对的。 if(System.out.append("Hello")==null){ System.out.print("Hello"); } else{ System.out.println(" world"); } 对于这个问题,可以看到很多看似不可能的方式其实还是能够实现的。不过话说过来,这也仅仅是一个类似脑筋急转弯的方式,在工作编程中可不要耍这种小聪明,得不偿失。

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2015-05-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏landv

C语言介绍

3432
来自专栏顶级程序员

Python 工匠:善用变量来改善代码质量

我一直觉得编程某种意义上是一门『手艺』,因为优雅而高效的代码,就如同完美的手工艺品一样让人赏心悦目。

1163
来自专栏互扯程序

Java8函数式编程实践精华

现在是资源共享的时代,同样也是知识分享的时代,如果你觉得本文能学到知识,请把知识与别人分享。

1223
来自专栏Golang语言社区

第十节 Go语言函数方法(上)

干货来了!!!为了让更多的小伙伴喜欢Golang、加入Golang之中来,Golang语言社区发起人彬哥联合业界大牛共同推出了Go语言基础、进阶、提高课程,目前...

752
来自专栏Python小屋

Python中带else子句的for循环执行过程

这几天在厦门讲课,每天6小时,没有太多时间写新代码,宾馆不知道咋想的也不提供WiFi,只好用手机做个热点临时分享一点基础知识,300M的包月流量伤不起,热点瞬间...

2754
来自专栏数说工作室

2. PRXPARSE () | 正则表达式的“阿赖耶识”

阿赖耶识...为宇宙万有之本,含藏万有,使之存而不失,故称藏识。又因其能含藏生长万有之种子,故亦称种子识。 ——《佛光大辞典》 佛家说人有九识,除眼、耳、鼻、...

3536
来自专栏Crossin的编程教室

【Python 第25课】 初探list

昨天课程里的例子有点没说清楚,有同学表示写在程序里发生了错误。因为我当时写这个代码片段时,心里假想着这是在一个函数的内部,所以用了return语句。如果你没有把...

3186
来自专栏更流畅、简洁的软件开发方式

面向对象的本质是什么?

  什么是面向对象的本质呢?   万物皆对象?No   抽象?No   复用?No   那到底是什么呢? 万物皆对象。问了几位网友,这是答复之一。看到了某个...

3439
来自专栏我杨某人的青春满是悔恨

Swift API 设计指南(上)

本文翻译自苹果官方文档:Swift API Design Guidelines,如有错漏,欢迎指出。

1063
来自专栏C语言及其他语言

第一个 C 语言编译器是怎样编写的?

作者: 伯乐在线 - Chaobs 网址: http://blog.jobbole.com/94311/ 首先向C语言之父Dennis Ritchie致敬! ...

3889

扫码关注云+社区