||、&&、和?:运算符的另一种用法
来源:互联网 发布:网络棋牌游戏代理 编辑:程序博客网 时间: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#无效,会报错,我很吃惊,但是确实会报错,它们不支持这种运算,如果要这么做的话,必须把最后结果赋值给一个变量。
- ||、&&、和?:运算符的另一种用法
- ?:三元运算符的另一种写法
- Smarty 模板定界符的另一种用法
- C++操作符operator的另一种用法
- 人民币的另一种用法
- using的另一种用法
- using的另一种用法
- 异常的另一种用法
- scanf的另一种用法
- marker的另一种用法
- menu的另一种用法
- lxml的另一种用法
- sizeof运算符和memcpy的用法
- C语言#和##运算符的用法
- String.Trim的另一种用法
- mdev -s的另一种用法
- java数组的另一种用法
- 关于Session的另一种用法
- Permutations 排列
- Windows Azure 网站开发Stacks支持
- 进制转换
- jquery选择器的用法总结
- readb(), readw(), readl(), __raw_readl
- ||、&&、和?:运算符的另一种用法
- USB Camera在android车机上应用前景及初试小结
- 3835. 计算三角形的周长
- 文件系统制作过程中遇到的问题
- bash脚本使用相对目录的问题dirname
- linux下的C语言开发(开篇)
- hdu 1702 栈和队列
- 最大似然估计、MAP及贝叶斯估计
- 数据结构之顺序表