gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:02:13 26 4
gpt4 key购买 nike

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

T min_value = *begin++; 

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

我认为应该是:

  1. 将开始指针增加到 [1] 元素(数组中的第二个)
  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/36658810/

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