C++报错‘expression is not assignable’:求数组第二大值求助
解决数组找第二大值的报错与逻辑问题
嘿,刚入门编程遇到这种问题太正常啦,我来帮你揪出问题所在,再把代码捋顺!
首先说你遇到的「expression is not assignable」错误原因
你看这段代码:
(largest_value - array[i]) = large_value;
这行是把large_value的值赋给largest_value - array[i]这个表达式,但在C++里,只有变量(比如large_value、array[i]这种)才能被赋值,表达式是不能接收赋值的,这就导致了这个报错,而且这行逻辑本身也不对,完全可以删掉~
还有其他几个需要修正的逻辑问题
- 第一个循环里,你写了
array[i]=temp;,这是把未初始化的temp值覆盖到数组里了,反过来才对!应该是temp = array[i];,先把当前数组元素取出来再和最大值比较。 - 直接把
largest_value和large_value初始化为0是有坑的:如果数组里全是负数,最大值就会被错误地当成0,应该用数组的第一个元素来初始化(记得先判断数组不为空)。 - 第二个循环找第二大值的时候,
temp没被赋值,而且逻辑不对:应该跳过已经找到的最大值的那个元素,然后找剩下元素里的最大值。
修正后的完整代码
#include<iostream> int main(){ int i = 0, N = 0; int largest_value, large_value; int* array = nullptr; // 用nullptr比NULL更规范哦 std::cout << "Enter the Number of elements: "; std::cin >> N; // 先判断输入的N是否合法 if (N <= 0) { std::cout << "Please enter a positive number!" << std::endl; return 1; } array = new int[N]; // 读取数组元素 std::cout << "Enter the elements: " << std::endl; for(i = 0; i < N; i++){ std::cin >> array[i]; } // 初始化最大值和第二大值 largest_value = array[0]; large_value = array[0]; int idx_largest = 0, idx_large = 0; // 第一次遍历找最大值 for(i = 0; i < N; i++){ if(array[i] > largest_value){ largest_value = array[i]; idx_largest = i; } } // 第二次遍历找第二大值(跳过最大值的位置) for(i = 0; i < N; i++){ if(i == idx_largest){ continue; // 跳过最大值的元素 } if(array[i] > large_value){ large_value = array[i]; idx_large = i; } } std::cout << "The Equilibrium is between index " << idx_largest << " and " << idx_large << std::endl; std::cout << "Largest value: " << largest_value << ", Second largest value: " << large_value << std::endl; // 记得释放动态分配的内存,避免内存泄漏 delete[] array; return 0; }
代码里的关键改进点
- 加了输入合法性判断,避免用户输入负数或0导致的错误。
- 用数组第一个元素初始化最大值和第二大值,适配负数场景。
- 找第二大值时跳过了最大值的位置,确保拿到真正的第二大值。
- 释放了动态分配的数组内存,避免内存泄漏(新手容易忘这个哦)。
你可以运行修正后的代码试试,应该就能正常工作啦!
内容的提问来源于stack exchange,提问作者Sam Francis
相关产品推荐
相关产品推荐

