Questions tagged «operators»

对于编程语言,运算符是一种构造,其行为通常类似于函数,但在语法或语义上与常规函数不同。从Wikipedia:http://en.wikipedia.org/wiki/Operator_%28programming%29

16
为什么用户定义的运算符不更常见?
我从功能语言中错过的一个特性是,运算符只是函数,因此添加自定义运算符通常与添加函数一样简单。许多过程语言都允许运算符重载,因此从某种意义上说,运算符仍然是函数(在D中,该运算符在模板参数中作为字符串传递,这是非常正确的)。 似乎在允许运算符重载的地方,添加额外的自定义运算符通常很简单。我找到了这篇博客文章,该文章认为由于优先级规则,自定义运算符不能很好地使用后缀表示法,但是作者为该问题提供了几种解决方案。 我环顾四周,找不到支持该语言中的自定义运算符的任何过程语言。有一些技巧(例如C ++中的宏),但这与语言支持几乎不一样。 由于此功能实施起来很简单,为什么它不更常见? 我知道这可能会导致某些丑陋的代码,但是这并没有阻止语言设计人员过去添加易于使用的有用功能(宏,三元运算符,不安全的指针)。 实际用例: 实现缺少的运算符(例如,Lua没有按位运算符) 模拟D ~(数组串联) DSL 使用|如UNIX管道风格的语法糖(使用协程/发电机) 我对确实允许自定义运算符的语言也很感兴趣,但是我对为什么它被排除在外更感兴趣。我曾考虑过分叉一种脚本语言来添加用户定义的运算符,但是当我意识到自己没在任何地方看到它时就停下来了,所以可能有充分的理由为什么比我更聪明的语言设计师不允许这样做。

7
短路评估,这是不好的做法吗?
我已经知道了一段时间,但从未考虑过的一件事是,在大多数语言中,可以根据其顺序在if语句中为运算符赋予优先级。我经常用这种方法来防止空引用异常,例如: if (smartphone != null && smartphone.GetSignal() > 50) { // Do stuff } 在这种情况下,代码将导致首先检查对象是否不为null,然后在知道该对象存在的情况下使用该对象。该语言很聪明,因为它知道如果第一条语句为假,那么即使评估第二条语句也没有意义,因此永远不会抛出空引用异常。对于and和or运算符,其作用相同。 据我所知,这在其他情况下也很有用,例如检查索引是否在数组的边界内,并且可以用各种语言执行这种技术:Java,C#,C ++,Python和Matlab。 我的问题是:这种代码是否代表不良做法?这种不良做法是由某种隐藏的技术问题引起的(例如,这最终可能导致错误)还是对其他程序员而言导致可读性问题?会令人困惑吗?

15
我不明白反对运算符重载的论点
我刚刚读过Joel的其中一篇文章,他说: 通常,我必须承认我有点害怕隐藏事物的语言功能。当您看到代码时 i = j * 5; …至少在C中,您知道j被乘以5,结果存储在i中。 但是,如果您在C ++中看到相同的代码片段,则您一无所知。没有。知道C ++中真正发生的事情的唯一方法是找出i和j是什么类型,这些类型可能在其他地方完全声明。这是因为j可能属于operator*重载类型,并且在您尝试将其乘以乘法时会表现出极大的机智。 (强调我。)害怕隐藏事物的语言功能吗?你怎么会害怕呢?隐藏事物(也称为抽象)不是面向对象编程的关键思想之一吗?每次调用方法时a.foo(b),您都不知道该怎么做。您必须找出什么类型a和b是什么,然后才可能在其他地方声明它们。那么我们应该放弃面向对象的编程,因为它对程序员隐藏了太多的东西吗? 与可能有j * 5什么不同j.multiply(5),您可能必须使用不支持运算符重载的语言编写?再次,您将必须找出方法j内部的类型和peek multiply,因为lo和bekeeper j可能是具有某种multiply方法的类型,该方法执行某些非常机智的操作。 “ Muahaha,我是一个邪恶的程序员,只为一个方法命名multiply,但实际上它是完全晦涩且不直观的,并且与加乘运算绝对无关。” 设计编程语言时是否必须考虑这种情况?然后,我们不得不放弃编程语言中的标识符,理由是它们可能会误导人! 如果您想知道方法的作用,则可以浏览文档或浏览实现内部。运算符重载只是语法糖,我完全不知道它如何改变游戏。 请赐教。

25
三元运算符被认为有害吗?[关闭]
例如,您是否更喜欢这种单线 int median(int a, int b, int c) { return (a<b) ? (b<c) ? b : (a<c) ? c : a : (a<c) ? a : (b<c) ? c : b; } 还是涉及多个return语句的if / else解决方案? 什么时候?:合适,什么时候不合适?应该向初学者讲授还是隐藏起来?


2
为什么按位运算符的优先级比比较低?
有人可以解释其原理,为什么在一堆最流行的语言中(请参见下面的注释),比较运算符(==,!=,<,>,<=,> =)的优先级要高于按位运算符(&,|,^ ,〜)? 我认为我从未遇到过这种优先次序自然的用途。总是这样的: if( (x & MASK) == CORRECT ) ... // Chosen bits are in correct setting, rest unimportant if( (x ^ x_prev) == SET ) // only, and exactly SET bit changed if( (x & REQUIRED) < REQUIRED ) // Not all conditions satisfied 我要使用的情况: flags = …



7
是否有“ nor”的关键字或运算符?
是否有一个等于nor的运算符?例如,我最喜欢的颜色既不是绿色也不是蓝色。 该代码将等效于: // example one if (color!="green" && color!="blue") { } // example two if (x nor y) { // x is false and y is false }
56 operators 

9
为什么==运算符字符串值比较不能与Java兼容?
每个熟练的Java程序员都知道您需要使用String.equals()来比较字符串,而不是==,因为==会检查引用是否相等。 在处理字符串时,大多数时候我都是在检查值相等性,而不是引用相等性。在我看来,如果该语言允许仅使用==比较字符串值,则将更加直观。 作为比较,C#的==运算符检查字符串 s的值相等。并且,如果您确实需要检查引用是否相等,则可以使用String.ReferenceEquals。 另一个重要的一点是,字符串是不可变的,因此允许使用此功能不会造成任何损害。 有什么特殊原因不能在Java中实现?


7
为什么大多数主流语言不支持“ x <y <z”语法进行三路布尔比较?
如果我想比较两个数字(或其他排序良好的实体),则可以使用x &lt; y。如果我想比较其中的三个,那位高中代数的学生会建议尝试x &lt; y &lt; z。然后,我中的程序员将回答“不,那是无效的,您必须这样做x &lt; y &amp;&amp; y &lt; z”。 我遇到的大多数语言似乎都不支持这种语法,考虑到它在数学中的普遍性,这很奇怪。Python是一个明显的例外。JavaScript 看起来像是一个异常,但实际上,它只是运算符优先级和隐式转换的不幸产物。在node.js中,1 &lt; 3 &lt; 2评估为true,因为它确实是(1 &lt; 3) &lt; 2 === true &lt; 2 === 1 &lt; 2。 所以,我的问题是这样的:为什么x &lt; y &lt; z具有预期语义的编程语言不常见?

3
为什么C ++中的布尔类型支持++但不支持-?
为什么--布尔没有运算符,而布尔运算符却存在++呢? 我用C ++尝试过,不知道我的问题是否适用于另一种语言。我也很高兴知道。 我知道,我可以将运算符++与bool一起使用。它使布尔值等于true。 bool b = false; b++; // Now b == true. 为什么我们不能--相反地使用运算符? bool b = true; b--; // Now b == false; 它不是很有用,但我很好奇。

10
为什么大多数编程语言都没有“!>”(不大于)和“!<”(不小于)运算符?
我想知道是否有任何原因-或者仅仅是历史的偶然- 大多数编程语言中都没有!&gt;和!&lt;运算符? a &gt;= b (大于或等于b)可以写成!(a &lt; b) (a不小于b)等于a !&lt; b。 当我编码自己的表达式树生成器时,这个问题使我震惊。大多数编程语言都有的a != b运算符!(a=b),那么为什么不!&gt;加!&lt;? 更新: !&lt;(不少于)比(大于或等于)更容易发音&gt;= !&lt;(不少于)的类型比&gt;=(大于或等于)的类型短 !&lt;(不少于)比(大于或等于)更容易理解*&gt;= *因为OR是二进制运算符,所以您的大脑需要操作两个操作数(grater,等于),而因为NOT是一元运算符,并且您的大脑仅需要操作一个操作数(较小)。

9
让赋值运算符返回值有什么好处?
我正在开发一种语言,打算取代Javascript和PHP。(我看不出有任何问题。这两种语言都不具有庞大的安装基础。) 我要更改的一件事是将赋值运算符转换为赋值命令,从而取消了使用返回值的功能。 x=1; /* Assignment. */ if (x==1) {} /* Comparison. */ x==1; /* Error or warning, I've not decided yet. */ if (x=1) {} /* Error. */ 我知道这将意味着C员工如此钟爱的单行功能将不再起作用。我发现(几乎没有我个人经验的证据),这种情况在绝大多数情况下确实是比较操作。 还是?赋值运算符的返回值是否有任何实际用途,无法轻易重写?(对于具有这种概念的任何语言。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.