我遇到了与所用变量范围有关的问题。
代码:
int row_no, upflag, downflag;
for (int i = count; i > 0; i--)
{
asd = ds1.Tables[out_table].Rows[i][59].ToString();
int com1 = string.Compare(asd, "Upstream");
int com2 = string.Compare(asd, "Downstream");
if (com1 == 0 || com2 == 0)
{
row_no = i;
if (com1 == 0)
upflag = 1;
else
downflag = 1;
break;
}
}
if (upflag == 1)//
{
string val1 = ds1.Tables[out_table].Rows[count][59].ToString();
string val2 = ds1.Tables[out_table].Rows[(count - 1)][59].ToString();
}
在这段代码中,在最后的if(upflag == 1)条件下,我的VS2010在upflag下方显示一条红线并表示 使用未分配的局部变量'upflag'。
为什么会这样?在c ++中完全没问题,但是在多个嵌套循环/条件下,分配给括号内变量的值不会反映在它们之外,即使在循环之前声明变量也是如此。
请帮忙
答案 0 :(得分:3)
考虑count == 0
会发生什么。 for
循环的主体将不会被执行,并且不会为upflag
分配任何值。这就是为什么编译器说“使用未分配的局部变量” - 这意味着可能该变量未被分配。
在c ++中完全没问题
不,事实并非如此。编译器可能没有抱怨它,但它仍然是未定义的行为。
答案 1 :(得分:0)
我的VS2010在upflag下方显示一条红线,表示使用了未分配的本地变量' upflag'。
这正是你的问题。这是未分配的,您正试图比较它的价值。
首先将其初始化为值。
答案 2 :(得分:0)
使用:
int row_no = 0; //或任何其他值,如-1
int upflag = 0; //或任何其他值,如-1
int downflag = 0; //或任何其他值,如-1
因为需要首先初始化这些值。
答案 3 :(得分:0)
声明upflag但没有赋值,并且不保证在循环中初始化(例如,如果count为0,则循环不会达到upflag赋值)。
在声明时尝试将upflag = 0设置为默认值。
答案 4 :(得分:0)
这是因为C#编译器不允许使用未初始化的变量。如果编译器检测到可能尚未初始化的变量的使用,则会生成编译错误。
在C ++中,它显示相同的警告消息,但不会阻止用户编译。 如果您在声明中初始化计数,那么它将起作用。