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

来源:互联网 发布:网络棋牌游戏代理 编辑:程序博客网 时间:2024/06/06 01:53

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


0 0
原创粉丝点击