计算机语言中使用了多少三元运算符?

How many ternary operator used in computer language?

我很好奇除了 ?: 运算符外,编程语言中是否还使用了任何三元运算符。并且只能从维基百科中找到 2

是否只有我们用过的运算符?还有这些吗?

嗯,这不是三元运算符 per-say 但我确实认为 three way comparison operator 被低估了。

必须进行计算时ternary operator是合适的即使我不能使用里面的效果if/else 语句或 switch 语句因此,当我尝试计算时,0 或默认值被视为默认值。

if/elseswitch 语句要求我列举每一种可能发生的情况,并且只有在能够区分数值和分支的情况下才有用选择可以提供帮助。在某些情况下,很明显如果条件测试存在为什么它无济于事,仅仅是因为我太早或太晚无法对条件做某事,即使其他一些功能无法测试给定条件。

ternary operator 强制计算具有可以通过其后的代码的效果。其他类型的条件测试求助于使用 &&|| 运算符,它们不能保证通过。

元素更新

另一个有用的 class 三元运算符,特别是在函数式语言中,是 "element update" 运算符。例如OCaml expressions有3种更新语法:

  • a.b<-c 表示记录 a,其中字段 b 的值为 c
  • a.(b)<-c 表示数组 a,其中索引 b 的值为 c
  • a.[b]<-c 表示字符串 a,其中索引 b 的值为 c

请注意,这些不是 "assignment" 或 "modification" 意义上的 "update";原始对象未更改,并生成具有指定属性的 new 对象。因此,这些操作不能被视为两个二元运算符的简单组合。

同样,Isabelle定理证明器有:

  • a(|b := c|) 表示记录 a,其中字段 b 的值为 c

数组切片

另一种三元运算符是数组切片,例如在 Python 中我们有:

  • a[b:c]表示第一个元素是a[b],最后一个元素是a[c-1]
  • 的数组

其实Python有四元形式的切片:

  • a[b:c:d] 表示元素为 a[b + n*d] 的数组,其中 n 的范围从 0 到最大值,使得 b + n*d < c

Bash/ksh 变量替换

虽然很晦涩,bashseveral forms 三元的变量扩展(显然是从 ksh 借来的):

  • ${var:pos:len} 最多 len 个来自 $var 的字符,从 pos
  • 开始
  • ${var/Pattern/Replacement}$var 除了其中匹配 Pattern 的第一个子字符串被替换为 Replacement
  • ${var//Pattern/Replacement} 相同,只是所有匹配项都被替换了
  • ${var/#Pattern/Replacement} 就像第一种情况,除了 Pattern 必须匹配 $var
  • prefix
  • ${var/%Pattern/Replacement} 除了匹配一个后缀
  • 和前面一样

在我看来,这些是边界线,接近于碰巧接受三个参数的普通函数,以 shell 语法的有时巴洛克风格编写。但是,我将它们包括在内,因为它们完全由非字母符号组成。

同余模

数学中一个重要的三元关系是congruence modulo:

  • a ≡ b (mod c) 为真当且仅当 ab 都属于 c
  • 中的相同等价 class

我不知道有什么编程语言有这个,但是编程语言经常借用数学符号,所以它可能存在于一种晦涩的语言中。 (当然,大多数编程语言都有 mod 作为二元运算符,允许将上面的内容表示为 (a mod c) == (b mod c)。)此外,与 bash 变量替换语法不同,如果将其引入某种语言,它不会特定于该语言,因为它是在其他地方建立的符号,使其更类似于无处不在的 ?:

已排除

有一些运算符类别我选择从 "ternary" 运算符的类别中排除:

  • 函数应用 (a(b,c)) 之类的操作可以应用于任意数量的运算符。
  • 接受三个参数的特定命名函数(例如,f(a,b,c)),因为它们太多了,在这种情况下没有任何意义。
  • SUM (Σ) 或 let 这样的操作作为新变量的绑定引入,因为 IMO 三元运算符应该作用于三个已经存在的东西。
  • sed 这样的语言中的单字母运算符恰好接受三个参数,因为它们真的很像命名函数的情况,而且该语言有一个非常简洁的命名约定。