当前位置:编程学习 > wap >>

诡异switch代码 ,求解释

switch (0) {
    case 0:
Log.e("Switch", "false");
return false;

    default:
Log.e("Switch", "true");
return true;
}

返回是false


---------------------------------------------------
如果代码是

switch (0) {
    case 0:
//Log.e("Switch", "false");
return false;

    default:
//Log.e("Switch", "true");
return true;
}

返回是true,求解释。
--------------------编程问答-------------------- 原因不是很清楚
但是你的switch有点问题啊
在每个case后面应该有break吧 --------------------编程问答-------------------- 一点都不诡异!
楼主应该先了解了解 switch 的用法,就知道一点都不诡异拉!
break很重要哦  --------------------编程问答-------------------- 除了break,楼主应该学习一下音频跟踪,难道没有发现代码会执行每一个case吗 --------------------编程问答--------------------
java基础 --------------------编程问答-------------------- LZ,你别信楼上的吹牛B,经调试,你的代码结果应该是一样的。,要么楼主你的判断有误!

还是LZ开玩笑? --------------------编程问答-------------------- 漏了break; --------------------编程问答--------------------
感觉都是return false;
怎么回事? --------------------编程问答-------------------- 是你们不了解switch 吧,return下面能break吗? 你写写试试直接报错。 --------------------编程问答-------------------- debug追踪一下不好么。。
还有 switch最好别放return
最好boolean一个局部变量,在case里修改这个局部变量的值。
最后在return这个局部变量。

很多公司都有要求的,一个方法只能有一个return。 --------------------编程问答--------------------
引用 9 楼 wlcw16 的回复:
debug追踪一下不好么。。
还有 switch最好别放return
最好boolean一个局部变量,在case里修改这个局部变量的值。
最后在return这个局部变量。

很多公司都有要求的,一个方法只能有一个return。


学习了,有时候虽然很方便,但是如果多个return 的时候 对于后期的维护 可能会带来麻烦。一进一出 学习了! --------------------编程问答-------------------- 建议LZ在case中不要使用return这玩意 --------------------编程问答-------------------- 经验证代码正常,且符合预期。楼主你是不是看花眼了? --------------------编程问答-------------------- 第二段代码也返回false --------------------编程问答-------------------- 很诡异 写个单例确实是2个结果都是一样的,但在项目有时却不一样。还是按照zqpeng观点,case中不要使用return这玩意。  --------------------编程问答-------------------- 如果你的环境测试真如你说的,有3个可能性:

1.你的常量宏编译器优化了;
2.如果你switch(0)的0其实是变量,而你简化而已,就是你自己算法真实运作跟你的想法有不同, 很多情况我们都为了不可能的大意调试大半天,逐步断点跟踪解决;
3.如为变量,内存溢出覆盖了这些区域,这个情况是其它地方内存溢出修改了 --------------------编程问答-------------------- 都是false吧,你的函数都return了,还怎么执行后面的? --------------------编程问答--------------------
引用 15 楼 maxlover2003 的回复:
如果你的环境测试真如你说的,有3个可能性:

1.你的常量宏编译器优化了;
2.如果你switch(0)的0其实是变量,而你简化而已,就是你自己算法真实运作跟你的想法有不同, 很多情况我们都为了不可能的大意调试大半天,逐步断点跟踪解决;
3.如为变量,内存溢出覆盖了这些区域,这个情况是其它地方内存溢出修改了


你说的第2点0是确实是变量,断点我跟踪了值是0,结果走default,我很难理解。还有switch所在方法我设置成是static。 --------------------编程问答-------------------- 正常应该都返回false,
return了还要break干嘛? --------------------编程问答-------------------- 其实你验证很简单, 写个测试, 就直接用你写的常量来断点走一遍,对比结果。

前面说过了,3个情况之一, 常年编程,偶尔我们都是范一些低级错误弄半天, 溢出的情况很难找,但是概率低,这个情况必然出现,你可以优先查看变量定义相近的其它变量的代码,因为内存分配的特性决定了概率。


还是那句话,最大可能就是你的程序逻辑超出你想想,仔细找找,硬着头皮也要来回调试,相信真理,相信自己,找出来爆一下粗口舒服一下,呵呵。 --------------------编程问答--------------------
引用 14 楼 zy32002 的回复:
很诡异 写个单例确实是2个结果都是一样的,但在项目有时却不一样。还是按照zqpeng观点,case中不要使用return这玩意。


这个说明你项目中的代码有问题,你再认真找找,比如是不是在某种条件下才return,而其他条件没return又没break呢? --------------------编程问答-------------------- --------------------编程问答-------------------- 首先,Switch的case中如果有return ,是不需要break的

如果你switch(0)的0变量,暂且说是o,这个变量是不是静态的?
如果这个变量是函数内的局部变量,则你说的情况绝不会发生。

如果这个变量是静态的。那原因就是没有对这个变量进行保护,被别的线程改写了。

你可以新建一个函数内局部变量来存放一下这个值,调试一下看看,是不是还是这样
如:
int oLocal=o;//复制一份静态变量到局部空间
oLocal=oLocal;//在这儿打个断点,看一下这个值,希望不会被优化掉,呵呵。
switch(oLocal)
...... --------------------编程问答--------------------
引用 楼主 zy32002 的回复:
switch (0) {
    case 0:
Log.e("Switch", "false");
return false;

    default:
Log.e("Switch", "true");
return true;
}

返回是false


-------------------------------------------……
本人是大神,两个都是返回false,鉴定完毕!
补充:移动开发 ,  Android
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,