现在的位置: 首页 > 综合 > 正文

||、&&、和?:运算符的另一种用法

2014年08月19日 ⁄ 综合 ⁄ 共 1256字 ⁄ 字号 评论关闭

前些日子看javascript编程精解,里面对javascript中的||和&&的描述让我比较意外,发现原来||和&&可以做这么多事,而不单单只是逻辑运算:

在javascript中的&&和||具有左路求值特性(如果左面能决定表达式的结果,就不会再看右边)。另外,这两个操作符除了用于对布尔值的操作外,也可以用于其他类型的值,并返回其中一个参数(有点像?:运算符,当然,js中也有这个三目运算符).

在javascript中,

||的真正作用是:首先检查左边的值,如果能将该值转化成布尔类型,并且值true,就返回左边的值,否则返回右边的值。

&&与||类似,但是确是相反的形式,当左边的值转换为布尔值是false时,返回该值,否则返回右边的值。

这样你可以通过使用它们,对你的代码进行缩减,举一个javascript的例子:

var input = prompt("What is your name?", "Kilgore Trout");
print("Well hello " + (input || "dear"));

prompt是带文本框的对话框,第二个参数是文本框的默认值,用户可在文本框里输入内容。

如果用户没有在文本框里输入名字,而是按 ' 取消 ' 或关闭提示对话框,变量input将会得到null或是“”,这两者在转化成bool值的时候都会是false,表达式input || "dear"会得到input值或者是dear。这就为input提供了一个默认值。

再一个c++的例子:

我要比较一个数组a的最大和最小值,一般可能会这样实现:

for(int i = 0; i < n; ++i )
{
	if(a[i] > max){
		max = a[i];
	}
	if(a[i] < min){
		min = a[i];
	}
}

但是使用&&、 ||, 你可以这样做:

for(int i = 0; i < n; ++i )
{
	(a[i] > max) && (max = a[i]);//要加括号,=的优先级比&&低
	(a[i] < min) && (min = a[i]);
	//或者使用||
	//(a[i] <= max) || (max = a[i]);
	 //(a[i] >= min) || (min = a[i]);
}

//上面的例子也可以用?:实现
(a[i] > max) ? (max = a[i]) : 1;//后面一个1无意义

再举一个?:运算符的例子:我在将两个长度相等的有序子数组a,b归并成一个数组t 时(情景和归并排序类似,这里条件设定了字数组长度相等),

一般我们可能会这样写:

int i = 0, j = 0;
for(int k = 0; k < n; ++k)
{
	if(a[i] > b[j])
		t[k] = b[j++];
	else
		t[k] = a[i++];
}

但是可以更加简单的写成:

int i = 0, j = 0;
for(int k = 0; k < n; ++k)
{
	(a[i] > b[j]) ? (t[k] = b[j++]) : (t[k] = a[i++]);
}

最后,你们可以自由发挥,用这几个符号精简你们的代码。另外,上面的操作对java和c#无效,会报错,我很吃惊,但是确实会报错,它们不支持这种运算,如果要这么做的话,必须把最后结果赋值给一个变量。

抱歉!评论已关闭.