省略号在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等的更多准备工作,请参阅“完整面试准备课程” 。