关于编程语言中?:运算符(三元表达式)的一个小实验

今天看c++的时候,看到?:运算符这一小节给了一段很有趣的代码。
//?:三元表达式
#include
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#
同时打多了几个空格,视觉上容易理解。最后得出的结论就是这一句的本质就是一个子三元表达式嵌套在了一个三元表达式里面。
我们知道?:运算符(三元表达式)可以用来替代if-else,所以等价过来,这一句代码翻译成if-else
//?:三元表达式等价if-else
#include
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之后,其实就一目了然了。不得不说?:运算符(三元表达式)真的很有趣




 
   
 
  

你可能感兴趣的:(编程语言)