📜  C++中的省略号与示例

📅  最后修改于: 2021-05-30 13:00:56             🧑  作者: Mango

省略号C++允许函数接受的参数的不确定数目。它称为变量参数列表。省略号告诉编译器不要检查函数应接受的参数的类型和数量,从而允许用户传递变量参数列表。默认情况下,功能只能使用函数事先已知的固定数量的参数。用户不能传递可变数量的参数。

程序1:

下面是给出编译错误的代码:

C++
// C++ program to demonstrate the
// compilation error as max function
// doesn't take more than 2 arguments
#include 
using namespace std;
  
// Driver Code
int main()
{
    // Below Line will given Compilation
    // Error as 4 arguments are passed
    // instead of 2
    int l = max(4, 5, 6, 7);
    cout << l;
    return 0;
}


C++
// C++ program to demonstrate the
// use of Ellipsis
#include 
#include 
using namespace std;
  
// Function accepting variable number
// of arguments using Ellipsis
double average(int count, ...)
{
    // va_list found in  and
    // list is its type, used to
    // iterate on ellipsis
    va_list list;
  
    // Initialize position of va_list
    va_start(list, count);
  
    double avg = 0.0;
  
    // Iterate through every argument
    for (int i = 0; i < count; i++) {
        avg += static_cast(va_arg(list, int))
               / count;
    }
  
    // Ends the use of va_list
    va_end(list);
  
    // Return the average
    return avg;
}
  
// Driver Code
int main()
{
    // Function call
    double avg = average(6, 1, 2, 3, 4, 5, 6);
  
    // Print Average
    cout << "Average is " << avg;
    return 0;
}


输出:
以下是上述程序的输出:

解释:

最大限度() 函数只能接受2个参数。因此,在函数调用中使用4个参数时,编译器将引发错误。但是,在某些情况下,函数必须采用可变数量的参数。

我们可以使用省略号传递参数数量。它在cstdarg头文件下定义。省略号不是关键字,而是用“ …”符号表示。

下面是说明省略号用法的程序:

C++

// C++ program to demonstrate the
// use of Ellipsis
#include 
#include 
using namespace std;
  
// Function accepting variable number
// of arguments using Ellipsis
double average(int count, ...)
{
    // va_list found in  and
    // list is its type, used to
    // iterate on ellipsis
    va_list list;
  
    // Initialize position of va_list
    va_start(list, count);
  
    double avg = 0.0;
  
    // Iterate through every argument
    for (int i = 0; i < count; i++) {
        avg += static_cast(va_arg(list, int))
               / count;
    }
  
    // Ends the use of va_list
    va_end(list);
  
    // Return the average
    return avg;
}
  
// Driver Code
int main()
{
    // Function call
    double avg = average(6, 1, 2, 3, 4, 5, 6);
  
    // Print Average
    cout << "Average is " << avg;
    return 0;
}
输出:
Average is 3.5

解释:

在这里,average()接受六个参数并计算平均值。让我们看看它是如何工作的。

  • va_list类型用于访问省略号中的值。如果您将省略号视为数组,那么从概念上讲,这对您来说将很容易。在这种情况下,va_list将充当迭代器类型。 va_list不是特殊类型。这是一个宏定义。
  • va_start指向省略号起点处的va_list。它有两个参数:va_list本身和最后一个普通参数(非省略号)。
  • va_arg返回va_list当前引用的值,并将va_list移动到下一个参数。它还需要两个参数:va_list本身和我们尝试访问的参数的类型。
  • va_end仅接受一个参数:va_list本身。它用于清理va_list宏。

尽管省略号为我们提供了一些有用的功能,但是使用它们非常危险。使用省略号时,编译器不会检查传递给函数的参数类型。因此,如果参数为不同类型,则编译器不会引发任何错误。即使将传递的字符串,double或bool类型的值传递给average()函数,它返回的结果也会返回意外值,编译器不会引发任何错误。

要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”