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
中的类型时,您正在 创建 一个新变量(在您的例子中是三个变量:j
、tmp
,以及 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
在这种情况下可能会有所帮助。
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
中的类型时,您正在 创建 一个新变量(在您的例子中是三个变量:j
、tmp
,以及 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
在这种情况下可能会有所帮助。