省略號 (計算機編程)

計算機編程中,省略號表示法(.. 或 ...)用於表示範圍英語range (computer programming)、未指定個數的實參、或者父文件夾。程式語言一般要求省略號寫為一系列的句點;不能寫為單個的Unicode省略號字符。

範圍

編輯

一些程式語言 (如AdaPerlRubyGroovyKotlinHaskellPascal),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運算符重載了".."用於純量上下文,這稱為翻轉運算符 - 有狀態英語stateful雙穩布爾測試,類似於SedAWK中的","運算符。[1]

GNU C編譯器提供的C和C++語言編譯擴展允許在switch語句英語switch statement中的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]

從版本1.5開始,Java語言支持了"varargs"功能。例如:

public int func(int num, String... strings)

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)

其他語義

編輯

MATLAB中,三字符省略號用於指出「續行」[10]

x = [ 1 2 3 ...
4 5 6 ];

語義上等價於:

x = [ 1 2 3 4 5 6 ];

參考文獻

編輯
  1. ^ perlop - perldoc.perl.org. [2022-02-19]. (原始內容存檔於2012-07-17). 
  2. ^ 存档副本. [2022-02-19]. (原始內容存檔於2020-07-16). 
  3. ^ https://doc.perl6.org/language/operators#listop_頁面存檔備份,存於互聯網檔案館)...
  4. ^ 存档副本. [2022-02-19]. (原始內容存檔於2021-03-27). 
  5. ^ Variadic Macros - Using the GNU Compiler Collection (GCC). [2022-02-19]. (原始內容存檔於2020-07-04). 
  6. ^ Working draft changes for C99 preprocessor synchronization - http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1653.htm頁面存檔備份,存於互聯網檔案館
  7. ^ Working Draft, Standard for Programming Language C++ (PDF). [2022-02-19]. (原始內容 (PDF)存檔於2019-05-08). : 14.5.3 Variadic templates
  8. ^ 存档副本. [2022-02-19]. (原始內容存檔於2022-02-21). 
  9. ^ 存档副本. [2022-02-19]. (原始內容存檔於2020-04-03). 
  10. ^ Mathworks.com. [2022-02-19]. (原始內容存檔於2011-06-29).