讨论/综合讨论/在java和c#中A[m-1]=A[m-- - 1];而在C中A[m-1]!=A[m-- - 1];/
在java和c#中A[m-1]=A[m-- - 1];而在C中A[m-1]!=A[m-- - 1];

简介

在C语言中等号后一个m自减会作用于等号前的m,假如m=3,那么在C语言中上式子就为A[1]=A[2];而在c#和java中上式子又为A[2]=A[2];

c语言:
B0Q3)JK(Z~V2Q1{])3IZ_JN.png
C#:
J[~~67AH4YU5Y9}L9LY5~XD.png
比如leetcode合并排序数字这题,代码相同,测试用例相同,但是输出结果不同,代码如下,感兴趣的可以测试下,另外有没有哪位大佬解释下原因啊
合并两个有序数组

  void merge(int* A, int ASize, int m, int* B, int BSize, int n)//C语言
{
      
    while (m > 0 && n > 0) {
            // 对比选出较大的数放在 m + n - 1 的位置,并将选出此数的指针向前移动
            A[m + n - 1] = A[m - 1] > B[n - 1] ? A[m-- - 1] : B[n-- - 1];
        }
        // 剩下的数都比已经遍历过的数小
        // 如果 m 不为 0,则 A 没遍历完,都已经在 A 中不用再管
        // 如果 n 不为 0,则 B 没遍历完,直接全移到 A 中相同的位置
        while (n > 0) {
            A[n - 1] = B[n - 1];
            n--;
        }
}

class Solution {
    public void merge(int[] A, int m, int[] B, int n) //java语言
{
        // 先确保将其中一个数组中的数字遍历完
        while (m > 0 && n > 0) {
            // 对比选出较大的数放在 m + n - 1 的位置,并将选出此数的指针向前移动
            A[m + n - 1] = A[m - 1] > B[n - 1] ? A[m-- - 1] : B[n-- - 1];
        }
        // 剩下的数都比已经遍历过的数小
        // 如果 m 不为 0,则 A 没遍历完,都已经在 A 中不用再管
        // 如果 n 不为 0,则 B 没遍历完,直接全移到 A 中相同的位置
        while (n > 0) {
            A[n - 1] = B[n - 1];
            n--;
        }
    }
}


展开讨论

你可以查看下他俩的汇编语言。不出意外是因为C和java对A和B在汇编语言下读取顺序不一致。

展开全部 6 讨论