为什么我不能用min和max作为变量名? 在这个C++程序中,函数PrtutSnUnS不接受 在switch_函数中调用时,向量数作为实际参数,我希望add_num函数接受向量作为参数,但我认为这会导致相同的错误 注意到,在这个代码中没有提到的错误,但是当我编译这个代码时出现了许多错误和警告,当我将双min改为双minn或双max到双Max时,我举了上述错误,我仍然是C++初学者,所以请解释为什么我不能使用min和max这个词。还有函数print_nums的主要错误和任何其他错误或警告 #include <iostream> #include <vector> #include <climits> #include <cfloat> using namespace std; double mean{}; double min=FLT_MAX; double max=FLT_MIN; vector<double>numbers{}; char select; char list(); void print_nums(vector<double>&numbers); void program_func(); double nums_mean(double); char switch_function(char); void display_nums_mean(double); int main(){ program_func(); return 0; } void program_func(){ while(select!='q'&&select!='Q'){ list(); switch_function(select); } } char list(){ cout<<"Please select an Order\n"; cout<<"***********************\n"; cout<<"P-Print numbers\n"; cout<<"A-Add a number\n"; cout<<"M-Display the numbers mean\n"; cout<<"S-Display smallest number\n"; cout<<"L-Display largest number\n"; cout<<"Q-Quit\n"; cout<<"Order " ; cin>>select; cout<<endl; return select; } void print_nums(const vector <double> &numbers){ if(numbers.size()!=0) for(auto value : numbers) cout<<value<<endl; else cout<<"Array is empty"<<endl; } void add_num(){ cout<<"How many numbers will be added to the list : "; unsigned int num_of_nums; double num; cin>>num_of_nums; cout<<endl; cout<<"add numbers to the list : "; for(unsigned int i=0;i<num_of_nums;i++){ cin>>num; numbers.push_back(num); } return; } double nums_mean(double mean){ double sum{}; for(unsigned int i=0;i<numbers.size();++i){ sum+=numbers.at(i); } mean = sum/(numbers.size()); return mean; } double small_num(double min){ for(unsigned int i=0;i<numbers.size();++i){ if(min>=numbers.at(i)){ min = numbers.at(i); } } return min; } double large_num(double max){ for(unsigned int i=0;i<numbers.size();++i){ if(max<=numbers.at(i)){ max = numbers.at(i); } } return max; } void display_nums_mean(double mean){ cout<<"The mean of the numbers is : "<<mean<<endl; } void display_nums_min(double min){ cout<<"The minimum number is : "<<min<<endl; } void display_nums_max(double max){ cout<<"The maximum number is : "<<max<<endl; return; } char switch_function(char select){ switch(select){ case 'p': case 'P': print_nums(numbers); break; case 'a': case 'A': add_num(); break; case 'm': case 'M': mean=nums_mean(mean); display_nums_mean(mean); break; case 's': case 'S': min=small_num(min); display_nums_min(min); break; case 'l': case 'L': max=large_num(max); display_nums_max(max); break; case 'q': case 'Q': return select; default: cout<<"Please Enter a valid character "<<endl; } return select; }
使用名称空间std;摆脱这个习惯,这意味着std::min和std::max从std名称空间拉入全局名称空间。这就是为什么您不能在自己的代码中使用这些名称,因为它们已经被定义了 我仍然是C++初学者,请解释为什么我不能用“min”和“max”这个词。p> 你可以 下面的第一节用最少的代码演示了正在发生的事情 第二节显示了下面的“解决方案”为什么我不能用min和max作为变量名? 在这个C++程序中,函数PrtutSnUnS不接受 在switch_函数中调用时,向量数作为实际参数,我希望add_num函数接受向量作为参数,但我认为这会导致相同的错误 注意到,在这个代码中没有提到的错误,但是当我编译这个代码时出现了许多错误和警告,当我将双min改为双minn或双max到双Max时,我举了上述错误,我仍然是C++初学者,所以请解释为什么我不能使用min和max这个词。还有函数print_nums的主要错误和任何其他错误或警告 #include <iostream> #include <vector> #include <climits> #include <cfloat> using namespace std; double mean{}; double min=FLT_MAX; double max=FLT_MIN; vector<double>numbers{}; char select; char list(); void print_nums(vector<double>&numbers); void program_func(); double nums_mean(double); char switch_function(char); void display_nums_mean(double); int main(){ program_func(); return 0; } void program_func(){ while(select!='q'&&select!='Q'){ list(); switch_function(select); } } char list(){ cout<<"Please select an Order\n"; cout<<"***********************\n"; cout<<"P-Print numbers\n"; cout<<"A-Add a number\n"; cout<<"M-Display the numbers mean\n"; cout<<"S-Display smallest number\n"; cout<<"L-Display largest number\n"; cout<<"Q-Quit\n"; cout<<"Order " ; cin>>select; cout<<endl; return select; } void print_nums(const vector <double> &numbers){ if(numbers.size()!=0) for(auto value : numbers) cout<<value<<endl; else cout<<"Array is empty"<<endl; } void add_num(){ cout<<"How many numbers will be added to the list : "; unsigned int num_of_nums; double num; cin>>num_of_nums; cout<<endl; cout<<"add numbers to the list : "; for(unsigned int i=0;i<num_of_nums;i++){ cin>>num; numbers.push_back(num); } return; } double nums_mean(double mean){ double sum{}; for(unsigned int i=0;i<numbers.size();++i){ sum+=numbers.at(i); } mean = sum/(numbers.size()); return mean; } double small_num(double min){ for(unsigned int i=0;i<numbers.size();++i){ if(min>=numbers.at(i)){ min = numbers.at(i); } } return min; } double large_num(double max){ for(unsigned int i=0;i<numbers.size();++i){ if(max<=numbers.at(i)){ max = numbers.at(i); } } return max; } void display_nums_mean(double mean){ cout<<"The mean of the numbers is : "<<mean<<endl; } void display_nums_min(double min){ cout<<"The minimum number is : "<<min<<endl; } void display_nums_max(double max){ cout<<"The maximum number is : "<<max<<endl; return; } char switch_function(char select){ switch(select){ case 'p': case 'P': print_nums(numbers); break; case 'a': case 'A': add_num(); break; case 'm': case 'M': mean=nums_mean(mean); display_nums_mean(mean); break; case 's': case 'S': min=small_num(min); display_nums_min(min); break; case 'l': case 'L': max=large_num(max); display_nums_max(max); break; case 'q': case 'Q': return select; default: cout<<"Please Enter a valid character "<<endl; } return select; },c++,C++,使用名称空间std;摆脱这个习惯,这意味着std::min和std::max从std名称空间拉入全局名称空间。这就是为什么您不能在自己的代码中使用这些名称,因为它们已经被定义了 我仍然是C++初学者,请解释为什么我不能用“min”和“max”这个词。p> 你可以 下面的第一节用最少的代码演示了正在发生的事情 第二节显示了下面的“解决方案” 奖金第三节用C++类解决。 1两种编码选择中的第一种是[MCVE],您应该认识到它的起源,它会重新产生歧义,从而导致错误 // this first sect
奖金第三节用C++类解决。 1两种编码选择中的第一种是[MCVE],您应该认识到它的起源,它会重新产生歧义,从而导致错误
// this first section matches your code,
#include <iostream>
#include <vector>
#include <climits>
#include <cfloat>
using namespace std;
// this 'using' pulls a 'min' and 'max' (probably functions)
// from some std:: declaration
double min = FLT_MAX;
double max = FLT_MIN;
// ----^^^---- and now these 2 items create two ambiguity's because
// at this point, the compiler can no longer distinguish
// between the two min's (or max's).
void program_func(int argc, char* argv[]) {
std::cout << "\n " << argc
<< " " << argv[0]
<< "\n " << min // error: reference to ‘min’ is ambiguous
<< " " << max // error: reference to ‘max’ is ambiguous
<< std::endl;
}
int main(int argc, char* argv[]) {
program_func();
return 0;
}
2出于您的考虑,另一个尚未提及的解决MCVE形式中您的困境的“解决方案”是将您的代码尽可能简单地移动到一个“独特的”名称空间中。此操作可以很容易地完成:
#include <iostream>
#include <vector>
#include <climits>
#include <cfloat>
using namespace std;
// this 'using' pulls a 'min' and 'max' (probably functions)
// from some std:: declaration (as previous)
// now place all of **your** code (except main()) into a distinguishing namespace.
namespace AZ // (your initials, if you are not already using them ;)
{
double min = FLT_MAX; // these are now AZ::min
double max = FLT_MIN; // and AZ::max - unambiguous!
void program_func(int argc, char* argv[])
{
std::cout << "\n " << argc
<< " " << argv[0]
<< "\n\n " << min // reference to AV::min
<< " " << max // and AV::max
<< std::endl;
}
} // namespace AZ end
int main(int argc, char* argv[])
{
AZ::program_func(argc, argv); // NOTE AZ:: namespace qualifier!
return 0;
}
本节编译并运行时没有错误
符号不再“冲突”,且AZ::min和AZ::max相对于std::min和std::max是唯一的且可区分的
注1:这应该足以促使您选择不使用行:using namespace std
注2:如果使用名称空间std;,保留行;,不要把它放在你的名字空间包装器里面
是-仍然可以访问std::,在您独特的名称空间中,它们被称为std::min和std::max
函数print_nums的主要错误
也许还有第二个值得提出的问题。在MCVE上工作,并使用SO工具进行练习。你可以通过提问获得积分,而反对票则是要求你进行更多练习的投稿人
我想向你们强调mcve的重要性。“print_nums”错误是否与第一个问题有关
以及任何其他错误或警告
#include <iostream>
#include <vector>
#include <climits>
#include <cfloat>
using namespace std;
double mean{};
double min=FLT_MAX;
double max=FLT_MIN;
vector<double>numbers{};
char select;
char list();
void print_nums(vector<double>&numbers);
void program_func();
double nums_mean(double);
char switch_function(char);
void display_nums_mean(double);
int main(){
program_func();
return 0;
}
void program_func(){
while(select!='q'&&select!='Q'){
list();
switch_function(select);
}
}
char list(){
cout<<"Please select an Order\n";
cout<<"***********************\n";
cout<<"P-Print numbers\n";
cout<<"A-Add a number\n";
cout<<"M-Display the numbers mean\n";
cout<<"S-Display smallest number\n";
cout<<"L-Display largest number\n";
cout<<"Q-Quit\n";
cout<<"Order " ;
cin>>select;
cout<<endl;
return select;
}
void print_nums(const vector <double> &numbers){
if(numbers.size()!=0)
for(auto value : numbers)
cout<<value<<endl;
else
cout<<"Array is empty"<<endl;
}
void add_num(){
cout<<"How many numbers will be added to the list : ";
unsigned int num_of_nums;
double num;
cin>>num_of_nums;
cout<<endl;
cout<<"add numbers to the list : ";
for(unsigned int i=0;i<num_of_nums;i++){
cin>>num;
numbers.push_back(num);
}
return;
}
double nums_mean(double mean){
double sum{};
for(unsigned int i=0;i<numbers.size();++i){
sum+=numbers.at(i);
}
mean = sum/(numbers.size());
return mean;
}
double small_num(double min){
for(unsigned int i=0;i<numbers.size();++i){
if(min>=numbers.at(i)){
min = numbers.at(i);
}
}
return min;
}
double large_num(double max){
for(unsigned int i=0;i<numbers.size();++i){
if(max<=numbers.at(i)){
max = numbers.at(i);
}
}
return max;
}
void display_nums_mean(double mean){
cout<<"The mean of the numbers is : "<<mean<<endl;
}
void display_nums_min(double min){
cout<<"The minimum number is : "<<min<<endl;
}
void display_nums_max(double max){
cout<<"The maximum number is : "<<max<<endl;
return;
}
char switch_function(char select){
switch(select){
case 'p':
case 'P':
print_nums(numbers);
break;
case 'a':
case 'A':
add_num();
break;
case 'm':
case 'M':
mean=nums_mean(mean);
display_nums_mean(mean);
break;
case 's':
case 'S':
min=small_num(min);
display_nums_min(min);
break;
case 'l':
case 'L':
max=large_num(max);
display_nums_max(max);
break;
case 'q':
case 'Q':
return select;
default:
cout<<"Please Enter a valid character "<<endl;
}
return select;
}
通常,“帮助调试我的代码”不适用于此网站
3对于您的困境,另一个尚未提及的“解决方案”是将您的代码尽可能简单地移动到一个“与众不同”的类中
您已经将此代码标记为C++。IHO,C++的主要特点是类。因此,我建议初学者把精力集中在创建和使用类上,并学习提供的库“Vector >、
#include <iostream>
#include <vector>
#include <climits>
#include <cfloat>
using namespace std;
class AZ_t // suffix '_t' because a class defines a type
{
double min = FLT_MAX; // these are now AZ_t::min
double max = FLT_MIN; // and AZ_t::max - unambiguous!
int program_func(int argc, char* argv[])
{
std::cout << "\n " << argc
<< " " << argv[0]
<< "\n\n " << min // reference to AZ_t::min
<< " " << max // and AZ_t::max
<< std::endl;
}
// NOTE3 - see below
public: // above this statement is private
// a functor is easy to use, but it needs one more function:
int operator()(int argc, char* argv[]) {
return program_func(argc, argv);
}
}; // class AZ end
int main(int argc, char* argv[]) // main is now 1/2 the size
{
return AZ_t()(argc, argv); // because this functor is a 1 liner!
// ^^^^^^^^^^^^ -- parameter to operator()
// ^^^^^^ -- instance ctor (constructor)
// ^^^ -- operator() returns int
// instance dtor (destructor) runs when 1 liner is complete
}
本节编译并运行时没有错误
注3:此时,类AZ_t是其余代码的位置。“在类中”编码的一个好处是不需要函数转发。你的帖子大约有6个转发-c风格代码的证据只是以编译器计算出的任何顺序呈现函数,但我建议你尝试使用最可读的序列。使用名称空间std的行表示你包含了std名称空间。通过包含此名称空间,您将在该名称空间中包含许多函数和变量
使用任何变量时,如果命名空间std中存在同名的变量,则该变量将与其绑定。现在,通过在代码中声明另一个变量,编译器会混淆编码器所指的是哪一个变量
尝试为变量max_num和min_num使用更有意义的名称。
如果仍要使用max和min,请在用户定义的命名空间中声明它们,并在代码中引用它们。const vector&与vector不一样&为什么要用FLT\u max初始化double?还有一个DBL_MAX。@DeiDei我不知道:我原以为只有FLT_MAX,但在使用名称空间std时仍然出现错误;摆脱这个习惯,这意味着std::min和std::max从std名称空间拉入全局名称空间。@Rakete1111:我不同意重复的说法。您所链接的问题非常笼统,初学者几乎不可能在27个答案中找到这个特定的问题。有两个共同的原因,为什么Min和Max特别是C++中的常见问题,而且其中只有一个甚至在这些答案中被描述。
ing下一个关于原始问题的投诉。这是原始问题的适当过程,以及为什么它已经关闭。你的答案并不能解决代码中的所有问题。@πάνταῥεῖ 我没有试图修复代码中的所有问题。我只是想回答为什么不能用min和max作为变量名的原始问题?。一次解决一个问题。