在if中有多个判定条件的时候,if内条件的先后顺序也会影响计算机执行判定的次序
例如: 这一段代码在运行的时候会提示 AddressSanitizer: heap-buffer-overflow on address 0x602000000594 at pc 0x00000038fe84 bp 0x7ffeb2100bf0 sp 0x7ffeb2100be8 即下标超内存。
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
vector<int>copynums1(nums1);
int p1=0,p2=0;
if(n==0){return;}
if(m==0)
{nums1=nums2;return;}
while(p1+p2<m+n)
{
if((copynums1[p1]<nums2[p2]&&p1<m)||p2==n)
{
nums1[p1+p2]=copynums1[p1];
++p1;
}
else
{
nums1[p1+p2]=nums2[p2];++p2;
}
}
}
};
问题就在
if((copynums1[p1]<nums2[p2]&&p1<m)||p2==n)
这里因为p2在()后面,及时两者是并列关系,计算机仍是先执行了前面的判定导致p2超下标
将p2==n放在前面,程序执行正常
if(p2==n ||(copynums1[p1]<nums2[p2]&&p1<m))