Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C+中指针递增和取消引用的顺序+; 我在C++中辅导学生,最近遇到了一个涉及数组名的指针运算的问题。我最困惑的是这个声明 T min_value = *begin++;_C++_Arrays_Pointers - Fatal编程技术网

C+中指针递增和取消引用的顺序+; 我在C++中辅导学生,最近遇到了一个涉及数组名的指针运算的问题。我最困惑的是这个声明 T min_value = *begin++;

C+中指针递增和取消引用的顺序+; 我在C++中辅导学生,最近遇到了一个涉及数组名的指针运算的问题。我最困惑的是这个声明 T min_value = *begin++;,c++,arrays,pointers,C++,Arrays,Pointers,告诉我++运算符的优先级高于*取消引用运算符,因此我假设begin先递增,然后取消引用。此外,site还确认,当您将数组的名称传递给函数时,它会变成指向第一个元素元素[0]地址的指针。然而,当我在Visual Studio中运行下面的代码时,看起来min_值在开始时设置为1.5,这似乎与我认为的操作顺序相矛盾 我认为应该是: 递增指向[1]元素的开始指针(数组中的第二个) 取消对指针值的引用 将最小值设置为等于数组中的第二个元素 然而,我的实验似乎表明,相反,发生了一些不同的事情: 取消引用指针

告诉我++运算符的优先级高于*取消引用运算符,因此我假设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纳入这些信息。