计算机语言中使用了多少三元运算符?
How many ternary operator used in computer language?
我很好奇除了 ?:
运算符外,编程语言中是否还使用了任何三元运算符。并且只能从维基百科中找到 2
是否只有我们用过的运算符?还有这些吗?
嗯,这不是三元运算符 per-say 但我确实认为 three way comparison operator 被低估了。
当必须进行计算时ternary operator
是合适的,即使我不能使用里面的效果if
/else
语句或 switch
语句因此,当我尝试计算时,0
或默认值被视为默认值。
if
/else
或 switch
语句要求我列举每一种可能发生的情况,并且只有在能够区分数值和分支的情况下才有用选择可以提供帮助。在某些情况下,很明显如果条件测试存在为什么它无济于事,仅仅是因为我太早或太晚无法对条件做某事,即使其他一些功能无法测试给定条件。
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 变量替换
虽然很晦涩,bash
有 several 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)
为真当且仅当 a
和 b
都属于 c
中的相同等价 class
我不知道有什么编程语言有这个,但是编程语言经常借用数学符号,所以它可能存在于一种晦涩的语言中。 (当然,大多数编程语言都有 mod
作为二元运算符,允许将上面的内容表示为 (a mod c) == (b mod c)
。)此外,与 bash
变量替换语法不同,如果将其引入某种语言,它不会特定于该语言,因为它是在其他地方建立的符号,使其更类似于无处不在的 ?:
。
已排除
有一些运算符类别我选择从 "ternary" 运算符的类别中排除:
- 函数应用 (
a(b,c)
) 之类的操作可以应用于任意数量的运算符。
- 接受三个参数的特定命名函数(例如,
f(a,b,c)
),因为它们太多了,在这种情况下没有任何意义。
- 像
SUM
(Σ) 或 let
这样的操作作为新变量的绑定引入,因为 IMO 三元运算符应该作用于三个已经存在的东西。
- 像
sed
这样的语言中的单字母运算符恰好接受三个参数,因为它们真的很像命名函数的情况,而且该语言有一个非常简洁的命名约定。
我很好奇除了 ?:
运算符外,编程语言中是否还使用了任何三元运算符。并且只能从维基百科中找到 2
是否只有我们用过的运算符?还有这些吗?
嗯,这不是三元运算符 per-say 但我确实认为 three way comparison operator 被低估了。
当必须进行计算时ternary operator
是合适的,即使我不能使用里面的效果if
/else
语句或 switch
语句因此,当我尝试计算时,0
或默认值被视为默认值。
if
/else
或 switch
语句要求我列举每一种可能发生的情况,并且只有在能够区分数值和分支的情况下才有用选择可以提供帮助。在某些情况下,很明显如果条件测试存在为什么它无济于事,仅仅是因为我太早或太晚无法对条件做某事,即使其他一些功能无法测试给定条件。
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 变量替换
虽然很晦涩,bash
有 several 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)
为真当且仅当a
和b
都属于c
中的相同等价 class
我不知道有什么编程语言有这个,但是编程语言经常借用数学符号,所以它可能存在于一种晦涩的语言中。 (当然,大多数编程语言都有 mod
作为二元运算符,允许将上面的内容表示为 (a mod c) == (b mod c)
。)此外,与 bash
变量替换语法不同,如果将其引入某种语言,它不会特定于该语言,因为它是在其他地方建立的符号,使其更类似于无处不在的 ?:
。
已排除
有一些运算符类别我选择从 "ternary" 运算符的类别中排除:
- 函数应用 (
a(b,c)
) 之类的操作可以应用于任意数量的运算符。 - 接受三个参数的特定命名函数(例如,
f(a,b,c)
),因为它们太多了,在这种情况下没有任何意义。 - 像
SUM
(Σ) 或let
这样的操作作为新变量的绑定引入,因为 IMO 三元运算符应该作用于三个已经存在的东西。 - 像
sed
这样的语言中的单字母运算符恰好接受三个参数,因为它们真的很像命名函数的情况,而且该语言有一个非常简洁的命名约定。