用C和C ++调用的(…)是什么?


30

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

它叫什么名字?

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

还有其他细节...吗?

编辑: 我知道的目的...。我在问它的​​名称和分类,我希望它在C和C ++中都相似。



1
C可变参数函数和C ++可变参数模板参数完全不同,您能否提供在其中找到它的上下文?(PS,C / C ++不存在,请选择一个)
JVApen

1
我只想知道它的名称和分类
Ardent Coder,

Answers:


43

它是标点符号之一

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
但是,正如我的问题中提到的有关参数包的评论之一,您为什么不在答案中提及它?
狂热的编码员


5
@ArdentCoder:即使在参数包中,它在C ++中仍然被称为省略号。
Nicol Bolas

4
我要补充一点的...是,它不是运算符,因为它不能构成表达式的一部分(就C11§6.5所定义的“表达式” 而言)。它有更多的共同 { };比其他标点符号。
zwol

1
@zwol在C ++中,令牌...可以是表达式的一部分。但是正式语法不将其视为运算符
aschepler


8

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

是的,用外行的术语...可以认为是用例的一个或多个(例如,在伪代码标点符号中,我们有时使用多个点来表示不同类型),对于这些用例,如果考虑杂色(在某种意义上是多个) C ++中“可变”参数/参数),它将引用函数或模板的可变数量的参数。

它叫什么名字?

省略

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

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

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

我所知道的 -

  1. 它是一个特殊的说明符;
  2. 省略号始终位于参数列表的最后;
  3. 就其用法而言,仅当您要删除模板/功能的参数数量限制或需要扩展数量的参数时才使用它。(即,它在可变参量的类模板或函数模板中提供参数包扩展)实际上,我们通常需要一组固定的已知参数,因此不适用于大多数情况;
  4. 它也可以与sizeof运算符一起使用,因为它也被归类为扩展包。

编辑:我知道...我要询问其名称和分类的目的,希望它在C和C ++中都相似。

名称相同,但C ++和C的用法可能有所不同。

只熟悉前一种语言的用法。(我记得有一个HackerRank问题Variadics,覆盖其效用。)


3

在C和C ++中 ,三个句号的顺序...称为省略号


在C ++中,省略号有助于初始化和扩展不同种类的

  • A- parameter pack类型标识符之间有省略号
    Type ... identifier

  • A- pack expansion由图案和省略号组成
    pattern...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.