发布网友 发布时间:2024-10-18 06:26
共5个回答
热心网友 时间:1天前
楼上几位都是高手啊。够专业。哈哈
我也来解释一下啊,我用点通俗的语言。
第一个例子,赋值写在了循环体里面,而循环体的内容是有可能不被执行的(如果循环条件一次都不能满足的话),由于编译程序无法判断你的循环体是否100%会至少执行一次,因此,他会提示循环体后面的那个输出语句可能输出了没有赋值的变量。这就是提示给你错误的原因。
第二个例子很明显,程序按顺序执行。变量test 100% 的被赋值了,因为编译程序按顺序进行编译的时候发现test在输出之前确实执行到了为其赋值的语句啊。所以不会出现编译错误。
热心网友 时间:1天前
关键点:我们定义一个字符串变量后,在使用这个变量之前,如果没给它赋值,是不被允许的。
一个循环(while,for,if道理一样),是要先满足某个条件后,才执行里面的语句块。而条件有两种结果,真、假。
提醒下,它报的错是在第二个Console.WriteLine(test )报的错。
第一段程序给test赋值是在循环里面,既然是在循环里面,就有可能被赋值,或没赋值。只有保证赋值后才行。即使你这样写 while(true),条件永远为真,逻辑上是肯定给test赋值了,但是注意了,电脑不是人脑,它不会管你逻辑正不正确。只要理论上test没被赋值,电脑就给你判死刑。
第二段程序中因为把 for() 给注释掉了,它就不是循环了,不需要判断符不符合条件了。那两个大括号就只是摆设,没起作用,test理论上肯定被赋值,所以就能通过编译。
我写两段小代码
///////////////代码1
if(true)
{
test="line";
}
///////////////代码2
if(false)
{
test="line";
}else
{
test="line .....";
}
代码1跟你的循环同道理,行不通, 代码2就可以,因为不管条件是什么,test理论上都能被赋值,所以它就能通过编译。
这个跟作用域没什么关系。
热心网友 时间:1天前
你好,这个问题你可以这样理解!
c#中:如果定义的是全局变量,可以不用赋值,不同的数据类型会有不同的默认值;
如果定义是局部变量,一定要给它赋一个初始值。
注意:以上是针对C#中的基本数据值类型。
对于你说的第二情况:你注解了int i;和for().
因为string test;是引用类型,所以test被默认有了null值.这样运行是可以的.
对于你的程序,改成:int i=0;string test="";就可以了。
热心网友 时间:1天前
第一次是在for循环体中和外面定义string不同级,第二次虽然加了大括号但是程序依然是从上往下,没有去执行其他操作(例如if),也就是说有没有这个大括号都是一样的,所以和声明变量string属同一级,建议楼主看一下c#关于作用域的一章,如果for改成if,while或者其他操作的话(你明白我的意思吧),第二次输出那仍然会报错。
你写的第二个就相当于(1+2)+3的道理一样
热心网友 时间:1天前
兄弟 其实可以这样理解的 楼上的那些人都讲得太复杂了 变量的作用域其实就是作用在包括变量的花括号和嵌套在其中的花括号里 至于第二个那个花括号形同虚设罢了