【发布时间】:2015-10-15 23:05:37
【问题描述】:
我辅导 C++ 的学生,最近遇到了一个涉及数组名称的指针运算的问题。我最困惑的是声明
T min_value = *begin++;
Cplusplus 告诉我 ++ 运算符的优先级高于 * 取消引用运算符,因此我假设 begin 首先递增然后取消引用。此外,this 站点确认,当您将数组的名称传递给函数时,它会变成指向第一个元素(元素 [0])地址的指针。但是,当我在 Visual Studio 中运行下面的代码时,看起来 min_value 一开始就设置为 1.5,这似乎与我认为的操作顺序相矛盾。
我认为应该是:
- 增加指向 [1] 元素(数组中的第二个)的开始指针
- 取消引用指针值
- 将 min_value 设置为等于数组中的第二个元素。
但是,我的实验似乎表明正在发生一些不同的事情:
- 取消引用指针值
- 设置 min_value 等于数组的第一个元素
- 增加指向下一个元素的指针
有人可以澄清一下吗?
// Problem #3: Please write the implementation of min() function and max() function..
#include <iostream>
using namespace std;
template<typename T>
T min(T* begin, T* end)
{
T min_value = *begin++;
while(begin != end) // You can use for-loop too.
{
if( *begin < min_value)
min_value = *begin;
begin++;
}
return min_value;
}
template<typename T>
T max(T* begin, T* end)
{
T max_value = *begin++;
while(begin != end)
{
if( *begin > max_value)
max_value = *begin;
begin++;
}
return max_value;
}
int main()
{
double arr[] = { 1.5, 4.5, 3.5, 2.5, 5.5 };
int values[] = { 1, 2, 3, 4, -1, 5 };
cout << "min of arr[] is : " << min(arr, arr + 5) << endl;
cout << "min of values[] is : " << min(values, values + 6) << endl;
cout << "max of arr[] is : " << max(arr, arr + 5) << endl;
cout << "max of values[] is : " << max(values, values + 6) << endl;
}
【问题讨论】:
-
顺便说一句,如果他们是初学者,你应该教你的学生不要使用
using namespace。否则,他们最终将在标头中的全局范围内使用它。此外,min和max是名称冲突的特别热门候选,因为<algorithm>中潜伏着std::min和std::max函数。
标签: c++ arrays algorithm pointers post-increment