关于编程语言中?:运算符(三元表达式)的一个小实验
2016-09-28 17:38
344 查看
[align=left]今天看c++的时候,看到?:运算符这一小节给了一段很有趣的代码。[/align]
结果是它将按下面的顺序打印3个字符串
Jason Quillstone at your service
这一下子激起了我的好奇心,但是考虑到我并不熟悉c++,我决定用c#来研究一下这个的运行过程。
首先是翻译成等价的c#代码
因为c#不支持将!应用到int类型上,所以在这里做了一点小改动,先将int转成Boolean再取反,个人感觉是等价的。
不出意料的输出了一样的结果。
首先分析了一下这个表达式
从输出的结果反推,可以得出输出的变量分别是 x[0]、y、x[1]。
//?:三元表达式 #include<iostream> const char x[2][20] = { "Jason ","at your service\n" }; const char * y = "Quillstone "; int main() { using namespace std; for (int i = 0; i < 3; i++) { cout << ((i < 2) ? !i ? x[i] : y : x[1]); } cin.get(); cin.get(); return 0; }
结果是它将按下面的顺序打印3个字符串
Jason Quillstone at your service
这一下子激起了我的好奇心,但是考虑到我并不熟悉c++,我决定用c#来研究一下这个的运行过程。
首先是翻译成等价的c#代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; //三元表达式实验 namespace A { class B { static void Main(string[] args) { string[] x = new string[2] { "Jason \n", "at your service\n" }; string y = "Quillstone \n"; for (int i = 0; i < 3; i++) { Console.WriteLine(((i < 2) ? !Convert.ToBoolean(i) ? x[i] : y : x[1])); } Console.ReadKey(); } } }
因为c#不支持将!应用到int类型上,所以在这里做了一点小改动,先将int转成Boolean再取反,个人感觉是等价的。
不出意料的输出了一样的结果。
首先分析了一下这个表达式
cout << ((i < 2) ? !i ? x[i] : y : x[1]);//C++
Console.Write(((i < 2) ? !Convert.ToBoolean(i) ? x[i] : y : x[1]));//C#
从输出的结果反推,可以得出输出的变量分别是 x[0]、y、x[1]。
i == 0 ---------> x[i] ---------> Jason i == 1 ---------> y ---------> Quillstone i == 2 ---------> x[1] ---------> at your service
所以添加一个括号说明运行的顺序
Console.Write(((i < 2) ? (!Convert.ToBoolean(i) ? x[i] : y ) : x[1]));//C#
同时打多了几个空格,视觉上容易理解。最后得出的结论就是这一句的本质就是一个子三元表达式嵌套在了一个三元表达式里面。</span>
我们知道?:运算符(三元表达式)可以用来替代if-else,所以等价过来,这一句代码翻译成if-else</span>
//?:三元表达式等价if-else #include<iostream> const char x[2][20] = { "Jason ","at your service\n" }; const char * y = "Quillstone "; int main() { using namespace std; for (int i = 0; i < 3; i++) { //cout << ((i < 2) ? !i ? x[i] : y : x[1]); //等价if-else if (i < 2) { if (!i) { cout << x[i]; } else { cout << y; } } else { cout << x[1]; } } cin.get(); cin.get(); return 0; }翻译成if-else之后,其实就一目了然了。不得不说?:运算符(三元表达式)真的很有趣
相关文章推荐
- 关于javascript程序内存占用的一个有趣的实验
- 关于ACCESS-LIST的一个实验
- 开博第一篇:一个关于正则表达式相关的问题
- 关于三元表达式“?:”问号后面的两个操作数必须为同一类型 (C/C++源程序)
- 关于unsigned short越界的一个小实验
- 我好像又找到MS的一个BUG了,关于正则表达式的
- 一个关于交换机的综合实验
- 关于alter table move的一个小实验
- 关于一个表达式里有多个"++" 与 "--"
- 一个关于正则表达式的问题
- 一个关于电话号码的正则表达式
- 一个非常有趣的关于编程语言的描述
- 开博第一篇:一个关于正则表达式相关的问题
- 一个关于ISDN的实验
- 一个关于文件路径的正则表达式
- 转一个关于正则表达式的帖子
- 关于一个表达式判断2的幂的问题
- 关于JavaScript中的正则表达式——你不一定知道,也可能用不到,但说不定哪天就会遭遇的几个事实【新增一个】
- 一个关于路由的小综合实验
- 关于C#正则表达式十万火急 截取一个字符串中的子串 高手进了呀!!!!!