前些日子看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#无效,会报错,我很吃惊,但是确实会报错,它们不支持这种运算,如果要这么做的话,必须把最后结果赋值给一个变量。