省略号 (计算机编程)
在计算机编程中,省略号表示法(.. 或 ...)用于表示范围、未指定个数的实参、或者父文件夹。编程语言一般要求省略号写为一系列的句点;不能写为单个的Unicode省略号字符。
范围
[编辑]一些编程语言 (如Ada、Perl、Ruby、Groovy、Kotlin、Haskell、Pascal),2个句点作为省略号,用于表示给定两端数值的一个范围。例如,Perl语言的在1至100的整型列表(list)上迭代:foreach (1..100)
Ruby语言的...
运算符表示左闭右开范围。
Rust语言的..=
运算符包含边界值;而..
运算符不包含边界值。
C#语言从8.0版本开始支持数组下标访问使用..
运算符表示左闭右开范围。例如:
int[] numbers = new[] { 0, 10, 20, 30, 40, 50 };
int start = 1;
int amountToTake = 3;
int[] subset = numbers[start..(start + amountToTake)];
Display(subset); // output: 10 20 30
//省略部分操作数的写法,其中的 ^ 运算符是C# 8.0版本引入的从尾端计数:
// a.. is equivalent to a..^0
// ..b is equivalent to 0..b
// .. is equivalent to 0..^0
Perl与Ruby运算符重载了".."用于标量上下文,这称为翻转运算符 - 有状态的双稳布尔测试,类似于Sed和AWK中的","运算符。[1]
GNU C编译器提供的C和C++语言编译扩展允许在switch语句中的case ranges:
switch(u) {
case 0 ... 0x7F : putchar(c); break;
case 0x80 ... 0x7FF : putchar(0xC0 + c>>6); putchar( 0x80 + c&0x3f); break;
case 0x800 ... 0xFFFF : putchar(0xE0 + c>>12); putchar( 0x80 + (c>>6)&0x3f); putchar( 0x80 + (c>>12) ); break;
default: error("not supported!");
}
GNU C编译器还允许类似的C语言扩展:
int array[10] = { [0...5] = 1 };
Delphi / Turbo Pascal / Free Pascal:
var FilteredChars: set of [#0..#32,#127,'a'..'z'];
var CheckedItems: set of [4,10..38,241,58];
Unified Modeling Language (UML),2个字符的省略号被用于指出关联(association)的可变基数(cardinality)。例如1..*表示从1个到无穷个(等价于克莱尼星号的用法)。
父文件夹
[编辑]Windows和类Unix操作系统把".."用作在文件路径中访问父文件夹。
不完整的代码
[编辑]Perl语言[2]和Raku语言中[3],3字符的省略号也称作"yada yada yada"运算符,语义上表示代码将插入此处。
Python3也允许3字符省略号作为以后插入代码的占位符。
可变数量参数
[编辑]C和C++
[编辑]C语言的可变参数函数的参数表中,3字符省略号表示更多的不能显式列出的参数。例如:
int printf( const char* format, ... );
[4]
上述函数可用不同数据类型和个数的实参来对应。例如:
printf("numbers %i %i %i", 5, 10, 15);
和
printf("input string %s, %f", "another string", 0.5);
C99引入了variable number of arguments。[5]
C++11包含了C99预处理器,[6]并引入了variable number of arguments.[7]
Java
[编辑]从版本1.5开始,Java语言支持了"varargs"功能。例如:
public int func(int num, String... strings)
PHP
[编辑]PHP 5.6支持[8]使用省略号定义显式的可变参数函数,其中参数前面的...
表示从这个位置开始参数组成一个数组。例如:
function variadic_function($a, $b, ...$other)
{
return $other;
}
var_dump(variadic_function(1, 2, 3, 4, 5));
输出结果为:
array(3) {
[0]=>
int(3)
[1]=>
int(4)
[2]=>
int(5)
}
多维
[编辑]Python语言中,特别市NumPy,省略号用于从一个高维数组剪切出任意维度:[9]
>>> import numpy as np
>>> t = np.random.rand(2, 3, 4, 5)
>>> t[..., 0].shape # 从最后一维选出第一个元素,其他维度照搬
(2, 3, 4)
>>> t[0, ...].shape # 从第一维选出第一个元素,其他维度照搬
(3, 4, 5)
其他语义
[编辑]x = [ 1 2 3 ...
4 5 6 ];
语义上等价于:
x = [ 1 2 3 4 5 6 ];
参考文献
[编辑]- ^ perlop - perldoc.perl.org. [2022-02-19]. (原始内容存档于2012-07-17).
- ^ 存档副本. [2022-02-19]. (原始内容存档于2020-07-16).
- ^ https://doc.perl6.org/language/operators#listop_ (页面存档备份,存于互联网档案馆)...
- ^ 存档副本. [2022-02-19]. (原始内容存档于2021-03-27).
- ^ Variadic Macros - Using the GNU Compiler Collection (GCC). [2022-02-19]. (原始内容存档于2020-07-04).
- ^ Working draft changes for C99 preprocessor synchronization - http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1653.htm (页面存档备份,存于互联网档案馆)
- ^ Working Draft, Standard for Programming Language C++ (PDF). [2022-02-19]. (原始内容 (PDF)存档于2019-05-08).: 14.5.3 Variadic templates
- ^ 存档副本. [2022-02-19]. (原始内容存档于2022-02-21).
- ^ 存档副本. [2022-02-19]. (原始内容存档于2020-04-03).
- ^ Mathworks.com. [2022-02-19]. (原始内容存档于2011-06-29).