对一道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");
}
对于这个问题,可以看到很多看似不可能的方式其实还是能够实现的。不过话说过来,这也仅仅是一个类似脑筋急转弯的方式,在工作编程中可不要耍这种小聪明,得不偿失。
- Go语言 实现bitmap
- 最近的几个技术问题总结和答疑(八) (r9笔记第72天)
- Java基础-day05-代码题
- MySQL级联复制的同步问题(一) (r9笔记第71天)
- GO语言 TCP传输实例
- JavaScript 性能优化技巧分享
- 一个拷贝操作导致的潜在监听类问题(r9笔记第70天)
- Java基础-day05-基础题
- 【Go 语言社区算法课程 第一季 第3节 hash算法实现
- mongodb11天之屠龙宝刀(四)高级查询:MongoDB内嵌字段查询
- merge语句导致的ORA错误分析(r9笔记第67天)
- Go语言的单例模式(Singleton)
- DPDK 全面分析
- 关于Go语言中数组的参数传递问题
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用ES6的fetch API读取数据时要注意的一个和cookie相关的坑
- 跟牛老师一起学WEBGIS——WEBGIS基础(地图切片)
- Go语言 | 并发设计中的同步锁与waitgroup用法
- LeetCode 99 | 如何不用递归遍历二叉搜索树?MT方法给你答案
- 以攻击者角度学习某风控设备指纹产品
- 高并发系统三大利器之缓存
- 前端测试题:(解析)js中关于类(class)的继承的说法,下面错误的是?
- 程序员深夜惨遭老婆鄙视,原因竟是CAS原理太简单?| 每一张图都力求精美
- MySQL数据延迟跳动的问题分析
- Python GUI项目实战(八)修改密码功能的实现
- Prometheus监控神器-Alertmanager篇(3)
- Prometheus监控神器-Alertmanager篇(4)
- 71-STM32+ESP8266+AIR202基本控制篇-移植使用-移植微信小程序MQTT底层包到自己的工程项目
- 目标检测 | Anchor free之CornerNet网络深度解析
- 手把手教你 3 分钟搞定个人网站 http 免费升级到 https