gpt4 book ai didi

c++ - C++中递增和取消引用指针的顺序

转载 作者:太空狗 更新时间:2023-10-29 20:57:08 24 4
gpt4 key购买 nike

我在 C++ 辅导学生,最近遇到了一个涉及数组名称的指针运算的问题。我最困惑的是声明

T min_value = *begin++; 

Cplusplus告诉我++ 运算符的优先级高于 * 取消引用运算符,因此我假设 begin 首先递增然后取消引用。另外,this site 确认当您将数组名称传递给函数时,它会变成指向第一个元素(元素 [0])的地址的指针。然而,当我在 Visual Studio 中运行下面的代码时,看起来 min_value 一开始就设置为 1.5,这似乎与我认为的操作顺序相矛盾。

我认为应该是:

  1. 增加指向 [1] 元素(数组中的第 2 个)的开始指针
  2. 解引用指针值
  3. 将 min_value 设置为等于数组中的第二个元素。

但是,我的实验似乎表明发生了一些不同的事情:

  1. 解引用指针值
  2. 设置 min_value 等于数组的第一个元素
  3. 增加指向下一个元素的指针

有人可以澄清一下吗?

// 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;
}

最佳答案

优先级只是代码应该如何解析的规则。 ++ 在前,* 在后。但是当代码被执行时,您必须考虑运算符实际做什么

在您的情况下,会发生以下情况:

  1. 制作了一份begin
  2. 原件递增。
  3. 拷贝已退回。
  4. 拷贝已取消引用
  5. 拷贝分配给 min_value

这就是后增量运算符的工作方式,也是您在为自己的类型重载运算符时编写运算符的方式:

T operator++(int)
{
T copy = *this;
++(*this);
return copy;
}

实际上,在内置后递增运算符的情况下,递增不一定是第 2 步。它也可能在稍后发生,只要可观察到的行为相同即可。例如,没有什么能阻止编译器在返回拷贝后递增原始值。当然,您不能在自己的重载运算符中执行这样的操作。

关于c++ - C++中递增和取消引用指针的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31624692/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com