for (int I = 0; I<n; I++) 和 int I; 之间有什么区别?对于 (I = 0; I < n;I++)?

What is the difference between for (int I = 0; I<n; I++) and int I; for (I = 0; I < n;I++)?

leetcode 第 53 题我​​有这样的代码:

#include <stdio.h>

int solve(int arr[], int size)
{
    int lmax, qmax, tmp, i, j,  m = (size / 2) - 1;
    for (i = m, tmp = 0, lmax = arr[m]; i >= 0; i--)
    {
        tmp += arr[i];
        if (tmp > lmax)
        {
            lmax = tmp;
        }
        else
        {
            lmax = lmax;
        }
    }
    for (j = m + 1, tmp = 0, qmax = arr[m + 1]; j < size; j++)
    {
    
        tmp += arr[j];
        if (tmp > qmax)
        {
            qmax = tmp;
        }
        else
        {
            qmax = qmax;
        }
    }
    return lmax + qmax;
}

如果我更改此代码块:

int lmax, qmax, tmp, i, j,  m = (size / 2) - 1;

for (j = m + 1, tmp = 0, qmax = arr[m + 1]; j < size; j++)
{
   
    tmp += arr[j];
    if (tmp > qmax)
    {
        qmax = tmp;
    }
    else
    {
        qmax = qmax;
    }
}

至此

int lmax, qmax, tmp, i, m = (size / 2) - 1;

for (int j = m + 1, tmp = 0, qmax = arr[m + 1]; j < size; j++)
{
   
    tmp += arr[j];
    if (tmp > qmax)
    {
        qmax = tmp;
    }
    else
    {
        qmax = qmax;
    }
}

我改成哪个

int lmax, qmax, tmp, i, m = (size / 2) - 1; -> int lmax, qmax, tmp, i, j, m = (size / 2) - 1;

j -> int j

我的输出打印出不同的结果,我找不到对此有意义的解释,在“int j”的情况下,我可以在范围内打印正确的“qmax”值,但是当我尝试执行“lmax + qmax”时returns 个地址总和。

当您使用 for 中的类型时,您正在 创建 一个新变量(在您的例子中是三个变量:jtmp,以及 qmax)。如果有 other 个同名变量,则它们是 shadowed,直到循环终止。

int solve(int arr[], int size)
{
    int lmax, qmax, tmp,i, j,  m = (size / 2) - 1;

    // qmax exists here

    for (int j = m + 1, tmp = 0, qmax = arr[m + 1]; j < size; j++)
    {
        // loop with different j, tmp, and qmax
    }

    // back to old uninitialized qmax

    return lmax + qmax; // this qmax does not have the value you "want"
}

gcc 的选项 -Wshadow 在这种情况下可能会有所帮助。