当我添加语句时,C++ 中的错误结果输出
A wrong result output in C++, when I add a statement
我尝试在数组(大小为 n)中找到最小值和最大值,在一次遍历中使用 3 * (n // 2)
次比较。这是我的代码:
#include <iostream>
#include <initializer_list>
//!
//! @Brief:get the minmum and maxmum in 3 * ( n // 2) times comparison.
//! Create by Soyn. 31/7/15.
//!
bool IsOdd( size_t n)
{
return n % 2 ;
}
std::initializer_list<int> getLargerAndSmaller( int a, int b)
{
if(a <= b){
return {a,b};
}else{
return {b,a};
}
}
int main(void)
{
int Min, Max;
int a[] = {5,4,1,7,3,8,3,4,9,10};
int n = sizeof(a) / sizeof(a[0]);
for( int i = 0; i < n - 1; i += 2){
if( (i ==0) &&IsOdd(n)){ // initialize the Min and Max.
Min = Max = a[i];
} else{
auto item = getLargerAndSmaller(a[i],a[i+1]);
if(i == 0){
Min = *(item.begin());
Max = *(item.begin() + 1);
std :: cout << "Min: " << Min << " , " << "Max: " << Max << std :: endl;
}else{
std :: cout << *(item.begin()) << " , " << *( item.begin() + 1) << std :: endl;
Min > *(item.begin()) ? Min = *(item.begin()) : Min;
Max < *(item.begin() + 1) ? Max = *(item.begin() + 1) : Max;
std :: cout << "Min: " << Min << " , " << "Max: " << Max << std :: endl;
}
}
}
return 0;
}
为了测试我的代码,我在我的代码中添加了一些语句,比如
std :: cout << *(item.begin()) << " , " << *( item.begin() + 1) << std :: endl;
而这一点我想不通。当我添加这个时,结果是错误的。如果我清除它,它会很好用。下面是错误的结果图:
return std::initializer_list
的函数几乎永远不会正确,因为它们引用本地数组。
当你写 return {a, b};
时,或者等效地说明:
std::initializer_list<int> x = { a, b };
return x;
发生的事情是创建一个包含 2 个元素的自动(堆栈)数组,其中包含 a
和 b
的副本; initializer_list
对象持有对该本地数组的引用。
因此,当您访问 item
时,您正在访问一个悬空引用(未定义的行为)。
initializer_list
并非旨在用作容器 - 请改用 array
或 vector
或 pair
等。
我尝试在数组(大小为 n)中找到最小值和最大值,在一次遍历中使用 3 * (n // 2)
次比较。这是我的代码:
#include <iostream>
#include <initializer_list>
//!
//! @Brief:get the minmum and maxmum in 3 * ( n // 2) times comparison.
//! Create by Soyn. 31/7/15.
//!
bool IsOdd( size_t n)
{
return n % 2 ;
}
std::initializer_list<int> getLargerAndSmaller( int a, int b)
{
if(a <= b){
return {a,b};
}else{
return {b,a};
}
}
int main(void)
{
int Min, Max;
int a[] = {5,4,1,7,3,8,3,4,9,10};
int n = sizeof(a) / sizeof(a[0]);
for( int i = 0; i < n - 1; i += 2){
if( (i ==0) &&IsOdd(n)){ // initialize the Min and Max.
Min = Max = a[i];
} else{
auto item = getLargerAndSmaller(a[i],a[i+1]);
if(i == 0){
Min = *(item.begin());
Max = *(item.begin() + 1);
std :: cout << "Min: " << Min << " , " << "Max: " << Max << std :: endl;
}else{
std :: cout << *(item.begin()) << " , " << *( item.begin() + 1) << std :: endl;
Min > *(item.begin()) ? Min = *(item.begin()) : Min;
Max < *(item.begin() + 1) ? Max = *(item.begin() + 1) : Max;
std :: cout << "Min: " << Min << " , " << "Max: " << Max << std :: endl;
}
}
}
return 0;
}
为了测试我的代码,我在我的代码中添加了一些语句,比如
std :: cout << *(item.begin()) << " , " << *( item.begin() + 1) << std :: endl;
而这一点我想不通。当我添加这个时,结果是错误的。如果我清除它,它会很好用。下面是错误的结果图:
return std::initializer_list
的函数几乎永远不会正确,因为它们引用本地数组。
当你写 return {a, b};
时,或者等效地说明:
std::initializer_list<int> x = { a, b };
return x;
发生的事情是创建一个包含 2 个元素的自动(堆栈)数组,其中包含 a
和 b
的副本; initializer_list
对象持有对该本地数组的引用。
因此,当您访问 item
时,您正在访问一个悬空引用(未定义的行为)。
initializer_list
并非旨在用作容器 - 请改用 array
或 vector
或 pair
等。