C+中指针递增和取消引用的顺序+; 我在C++中辅导学生,最近遇到了一个涉及数组名的指针运算的问题。我最困惑的是这个声明 T min_value = *begin++;
告诉我++运算符的优先级高于*取消引用运算符,因此我假设begin先递增,然后取消引用。此外,site还确认,当您将数组的名称传递给函数时,它会变成指向第一个元素元素[0]地址的指针。然而,当我在Visual Studio中运行下面的代码时,看起来min_值在开始时设置为1.5,这似乎与我认为的操作顺序相矛盾 我认为应该是:C+中指针递增和取消引用的顺序+; 我在C++中辅导学生,最近遇到了一个涉及数组名的指针运算的问题。我最困惑的是这个声明 T min_value = *begin++;,c++,arrays,pointers,C++,Arrays,Pointers,告诉我++运算符的优先级高于*取消引用运算符,因此我假设begin先递增,然后取消引用。此外,site还确认,当您将数组的名称传递给函数时,它会变成指向第一个元素元素[0]地址的指针。然而,当我在Visual Studio中运行下面的代码时,看起来min_值在开始时设置为1.5,这似乎与我认为的操作顺序相矛盾 我认为应该是: 递增指向[1]元素的开始指针(数组中的第二个) 取消对指针值的引用 将最小值设置为等于数组中的第二个元素 然而,我的实验似乎表明,相反,发生了一些不同的事情: 取消引用指针
// 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;
}
//问题3:请编写min()函数和max()函数的实现。。
#包括
使用名称空间std;
模板
T最小值(T*开始,T*结束)
{
T最小值=*开始++;
while(begin!=end)//您也可以使用for循环。
{
如果(*开始<最小值)
最小值=*开始;
begin++;
}
返回最小值;
}
模板
T最大值(T*开始,T*结束)
{
T max_值=*begin++;
while(开始!=结束)
{
如果(*开始>最大值)
最大值=*开始;
begin++;
}
返回最大值;
}
int main()
{
双arr[]={1.5,4.5,3.5,2.5,5.5};
int值[]={1,2,3,4,-1,5};
不能
T min_value = *begin++;
可以想象如下
auto temp = begin;
T min_value = *temp;
++begin;
T * min( T* begin, T* end )
{
T *min_value = begin;
if ( begin != end )
{
while( ++begin != end )
{
if( *begin < *min_value ) min_value = begin;
}
}
return min_value;
}
根据C++标准(5.2.6增量和递减)
1后缀++表达式的值是其
操作数[注意:获得的值是原始值的副本
-结束注释]…对++表达式的值计算进行排序
在修改操作数对象之前
通常情况下,函数定义是错误的,因为begin
和end
指定的范围可以为空,并且begin可以指向有效范围之外。在这种情况下,您既不能增加begin,也不能取消对它的引用
因此,以下面的方式编写示例更为正确
auto temp = begin;
T min_value = *temp;
++begin;
T * min( T* begin, T* end )
{
T *min_value = begin;
if ( begin != end )
{
while( ++begin != end )
{
if( *begin < *min_value ) min_value = begin;
}
}
return min_value;
}
T*min(T*begin,T*end)
{
T*min_值=开始;
如果(开始!=结束)
{
while(++开始!=结束)
{
如果(*开始<*最小值)最小值=开始;
}
}
返回最小值;
}
在这种情况下,函数的调用如下所示
cout << "min of arr[] is : " << *min(arr, arr + 5) << endl;
^^^
cout您不应该混淆运算符的返回值和优先级
第一个是处理操作符返回的内容,第二个是处理何时发生的事情
因此,如果你有:
T min_value = *begin++;
以下是它的工作原理:
operator++
-它递增指针,但返回原来的指针
运算符*
-取消引用先前返回的指针,返回它指向的T
operator=
将左侧存储到右侧,返回右侧
您不使用最后一个返回值,但理论上可以
注意,在第2条中,您使用的是来自第1条的返回,而不是再次访问指针。
优先级只是代码应该如何解析的一个规则。<代码> ++/<代码>是第一位的,<代码> */代码>是第二位。但是当代码被执行时,您必须考虑操作员实际做什么。
在您的情况下,会发生以下情况:
制作了begin
的副本
原始值是递增的
副本已返回
副本被取消引用
副本被分配到min\u值
这就是post increment运算符的工作方式,也是在为自己的类型重载运算符时编写运算符的方式:
T operator++(int)
{
T copy = *this;
++(*this);
return copy;
}
实际上,对于内置的后增量运算符,增量不一定是第2步。只要可观察到的行为相同,增量也可能在以后发生。例如,没有任何东西可以阻止编译器在返回副本后增加原始值。您无法执行此操作当然,在你自己的重载运算符中使用。这是有道理的,你能解释一下为什么会出现这种情况吗?特别是为什么解引用和递增看起来是独立发生的?@wyverniv:它们不是独立发生的。只是后缀++
不仅递增,而且复制。所以序列is copy->increment->return copy->dereference copy.@wyverniv查看我更新的帖子,带有后缀增量运算符的表达式的值是在应用递增之前的操作数的值。顺便说一句,如果学生是初学者,你应该教他们不要使用使用名称空间
。否则,他们最终将使用此外,min
和max
是名称冲突的热门候选项,因为std::min
和std::max
函数潜伏在
中。第2步可能随时发生,但不一定发生在该过程中order@MattMcNabb:你说得对。我编辑了答案o纳入这些信息。