在C和C++中,(...)被称为什么?

34

... 的一个用途是用来表示 C 和 C++ 中的 可变参数 实体。

  • 它的名称是什么?

    可变参数(variadic)或省略号(ellipsis)。

  • 当以这种方式使用时,它被分类为运算符还是其他什么东西?

    不是运算符,它通常被称为可变参数列表(variable argument list)的一部分。

  • 关于 ... 的其他细节?

    可变参数列表必须至少有一个命名参数,然后才能使用省略号。省略号只能用在函数定义的参数列表中,不能用在函数声明中。

编辑: 我知道 ... 的用途。我询问的是它的名称和分类,我希望它在 C 和 C++ 中是相似的。


1
这个回答解决了你的问题吗?在C函数声明中,最后一个参数"..."是什么意思? - Ajay Dabas
1
C语言的可变参数函数和C++语言的可变模板参数是完全不同的,你能提供一下你发现这个问题的上下文吗?(PS:C/C++并不存在,请选择其中一个) - JVApen
1
我只想知道它的名字和分类。 - Ardent Coder
4个回答

46

它是标点符号之一。

6.4.6  Punctuators
Syntax punctuator:
     one of  [    ]    (    )    {   }    .    ->
             ++   --   &    *    +   -    ~    !
             /    %    <<   >>   <   >    <=   >=    ==   !=   ^   |   &&   ||
             ?    :    ;    ...
             =    *=   /=   %=   +=  -=   <<=  >>=   &=   ^=   |=
             ,    #    ##
             <:   :>   <%   %>   %:   %:%:
在函数声明中,它被称为省略号
某些编译器的C语言扩展也使用省略号。例如——gcc开关/情况范围扩展。
const char *test(unsigned num)
{
    switch(num)
    {
        case 0 ... 9:
            return "the value is in the 0 to 9 range";
        case 10 ... 99:
            return "the value is in the 10 to 99 range";
        default:
            return "out of tested range";
    }
}

https://godbolt.org/z/YBLma-


1
然而,正如我的问题中的一条评论提到的参数包一样,为什么你的答案没有提到它呢? - Ardent Coder
3
C11标准链接:http://port70.net/~nsz/c/c11/n1570.html#6.4.6 - pmg
5
即使是对于参数包(parameter packs),在C++中仍然称为省略号(ellipsis)。 - Nicol Bolas
4
我想补充一点,即 ... 不是运算符,因为它不能构成一个_表达式_的一部分(在[C11 §6.5]定义的'expression'的意义上)。 它与 { }; 更相似,而不是其他标点符号。 - zwol
1
在C++中,标记“...”可以是表达式的一部分。但它在正式语法中不被视为运算符。 - aschepler
1
@热衷编程者 折叠表达式:https://en.cppreference.com/w/cpp/language/fold - aschepler

12
... 被英语和C标准称为 省略号

7

在C和C ++中,...之一的用途是表示可变参数实体。

简单来说,...可以理解为表示一个或多个(在伪代码标点符号中,我们有时使用多个点以表示不同类型),对于C++中的可变参数(即在参数方面变化的多重意义上), 它将指代函数或模板的可变数量参数。

它的名字是什么?

省略号

当以这种方式使用时,它被归类为运算符还是其他东西?

不是运算符,因为它允许您传递任意数量的参数,而不是对它们进行操作。

关于省略号还有其他细节吗?

据我所知 -

  1. 它是一种特殊的说明符;
  2. 省略号始终出现在参数列表中的最后一个;
  3. 就其用法而言,只有当您希望去除模板/函数的参数限制或需要具有可扩展的参数数量以进行扩展时才使用它。 (即,它在可变类模板或函数模板中提供参数包扩展)。 在实践中,我们通常需要固定的已知参数集,因此它并不适用于大多数情况;
  4. 它可以与sizeof运算符一同使用,因为它也被归类为包扩展。

编辑:我知道...的用途,我想问的是它的名称和分类,希望在C和C ++中相似。

名称相同,但在C++和C中可能使用方式不同。

我只熟悉它在前者中的用法。(我记得在HackerRank上有一个有关 可变参数 的问题,涵盖了其实用性。)


3
在C和C++中,由三个连续的句点 ... 组成的序列称为省略号
在C++中,省略号有助于初始化和扩展不同种类的packs
  • 参数包 - 当类型标识符之间有一个省略号
    Type ... identifier

  • 扩展包 - 由一个模式和一个省略号组成
    pattern...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接