• 关于 循环中使用break 的搜索结果

问题

循环中使用break或继续循环时跳到指定的标签处

珍宝珠 2020-02-12 20:01:27 1 浏览量 回答数 1

回答

while可以用作无穷循环,很多地方都用到无穷循环。一个无穷循环如下所示: while(true) { 循环内容; ... } 无穷循环可以由自己循环中的某个条件式来结束。下面是一个循环内部终止的例子: while(true) { 语句; if(条件式) break; // 跳离循环 ... } 当条件式成立时,会执行break离开while循环,这个break与switch中的作用是一样的,都是要离开当时执行的程序块时使用。 class TestWhile { public static void main(String[] args) { while(true) { System.out.println( "执行 "); //值为真用break跳出执行while之后的语句 if(true) { break; } System.out.println( "继续执行 "); } } } //无穷循环固定格式为while(true),其中括号里的值固定为boolean型,并且要为真时,才会执行下面的语句. class TestWhile { public static void main(String[] args) { boolean flag = false; while(flag) //这时括号里的值为假,所以下面的语句都不会执行.如果改成while(!flag)就可以执行了. { System.out.println( "while为真时执行 "); //值为真用break跳出执行while之后的语句 if(true) { break; } System.out.println( "继续执行 "); } } }

蛮大人123 2019-12-02 02:25:28 0 浏览量 回答数 0

回答

使用带有标记的break。在Java中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的break语句,即可跳出外层循环。

YDYK 2020-04-25 13:33:31 0 浏览量 回答数 0

回答

break 命令一个简单的用途是退出执行中的循环。我们可以在 while 和 until 循环中使用 break 命令跳出循环。

黄二刀 2020-03-06 23:27:11 0 浏览量 回答数 0

回答

1、for循环中我们使用continue;终止本次循环计入下一个循环,使用break终止整个循环。 2、而在jquery中 $.each使用return true 终止本次循环计入下一个循环,return false终止整个循环。 函数返回值跟此处无关

程序猿cc 2019-12-02 00:52:23 0 浏览量 回答数 0

回答

准确来说,java中没有goto这样的语句,当然即使在c中也不推荐使用。 在java中可以找到实现类似功能的方法,该方法仅限于循环嵌套跳转到外层循环的情况。例如你可以在外层循环上使用lablename:(lablename是自定义标签名)的方式标注,在内循环中,可以使用break lablename;或者continue lablename跳转到外循环上。这样就可以模拟出类似goto语句的功能

1668934001470375 2019-12-02 01:01:41 0 浏览量 回答数 0

问题

java跳出嵌套循环的处理方法

蛮大人123 2019-12-01 19:57:06 930 浏览量 回答数 1

问题

请问这种写法是什么意思?还是为了单纯的炫技?

a123456678 2019-12-01 20:19:20 860 浏览量 回答数 1

回答

label 在 js 中几乎不会使用,但是有一个场景:多重循环的跳转控制必须要使用 labelfor(){ for(){ //此时 break 的时候会发生什么?跳出内层的 for 还是跳出整个 for 呢? break; } }

feeqi 2019-12-02 02:08:29 0 浏览量 回答数 0

回答

在Java中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的break 语句,即可跳出外层循环。例如: public static void main(String[] args) { ok: for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { System.out.println("i=" + i + ",j=" + j); if (j == 5) { break ok; } } } }

问问小秘 2020-03-27 17:34:15 0 浏览量 回答数 0

回答

"$i" 不用加“” $i for循环的使用: [php] view plain copy print? for(expr1;expr2;expr3){ } 第一个表达式(expr1)在循环开始前无条件求值一次。 expr2 在每次循环开始前求值。如果值为 TRUE,则继续循环,执行嵌套的循环语句。如果值为 FALSE,则终止循环。 expr3 在每次循环之后被求值(执行)。 每个表达式都可以为空或包括逗号分隔的多个表达式。表达式 expr2 中,所有用逗号分隔的表达式都会计算,但只取最后一个结果。expr2 为空意味着将无限循环下去(和 C 一样,PHP 认为其值为 TRUE)。这可能不像想象中那样没有用,因为经常会希望用 break 语句来结束循环而不是用 for 的表达式真值判断。

小旋风柴进 2019-12-02 02:00:55 0 浏览量 回答数 0

回答

如果你在循环中改变它,则无法保证迭代所有dict条目。在字典中添加或删除条目时迭代视图可能会引发RuntimeError或无法迭代所有条目。 您可以创建一个“枚举”无限循环,类似于您最初使用的尝试itertools.count()。例如: from itertools import count for i in count(): print(i) # don't run this without some mechanism to break the loop, i.e. # if (i == 10): # break OUTPUT 0 1 2 ...and so on 我刚刚在python2和python3中测试了你的代码 python3 output0,1,2,3,4python20,1,2,3,4,5,6,7有一件事可能会发生。当您创建第一个键值时,字典中只分配了一定量的内存,当您删除键值时,我们不会分配任何内存或释放内存,而只是删除值。一旦使用了所有分配的内存,它就会退出。因为如果你在没有del的情况下运行,你将收到此错误 RuntimeError: dictionary changed size during iteration因此python为该键值创建了足够的内存以及更多内存,一旦用完,就不再为字典分配内存。

一码平川MACHEL 2019-12-02 01:54:24 0 浏览量 回答数 0

回答

1.print和import1.1 print 略1.2 import(1)impore somemodule (2)from somemodule import somefunction(3)from somemodule import somefunction,anotherfunction(4)from somemodule import*(5)import somemodule as somename #为整个模块提供别名(6)from somemodule import somefunction as somename #为某个模块的某个函数提供别名 2.赋值2.1 序列解包:将多个值的序列解开,然后放到变量的序列中。2.2 链式赋值:将同一个值赋给多个变量。2.3 增量赋值:eg:x+=1 3.语句块:条件为真时执行或执行多次的一组语句,由代码前放置空格缩进语句创建。 4.条件语句4.1 布尔变量 python中的假:False None 0 “” () [] {}4.2 if语句4.3 else语句4.4 elif语句4.5 嵌套代码块4.6 条件(1)比较运算符 (2)相等运算符 == (3)同一性运算符 is (4)成员资格运算符 in (5)字符串和序列比较 (6)布尔运算符 4.7 断言: assert 放入检查点,确保某个条件一定为真才能让程序正常工作 循环 5.1 while循环 5.2 for循环 5.3 循环遍历字典元素 5.4 迭代工具 (1) 并行迭代:同时迭代两个序列 (2)按索引迭代 (3)翻转和排序迭代 5.5 跳出循环 (1) break (2) continue (3) while True/break 5.6 循环中的else子句 6.列表推导式-轻量级循环 7.pass,del,exec 本章相关代码: -- coding: utf-8 -- 1.print 与import 1.1 print 使用逗号输出 print 'Age:',42 #Age: 42name='xiaming'age='42'print name,age #xiaming 42 2.赋值语句 2.1.序列解包:将多个值的序列解开,然后放到变量的序列中 x,y,z=1,2,3print x,y,z #1 2 3x,y=y,x #2 1 3print x,y,zv=1,2,3x,y,z=vprint x #1 2.2.链式赋值 将同一个值赋给多个变量的捷径 x=y=4print x,y 2.3.增量赋值 x=2x+=1x*=2a='bo'a+='x'a*=2print x,a #6,boxbox 3:语句块:缩排 4.条件与条件语句 4.1.布尔变量的作用 4.2 if elif else语句 name=raw_input('what is your name?')if name.endswith('ming'): print 'hello,ming' elif name.endswith('hong'): print 'hello,hong' else: print 'hello' 4.3 嵌套语句 num=raw_input('input a number')if num>10: if num<20: print '10<num<20' else: print 'num>=20' else: print 'num<=10' #5.循环 5.1.while循环 x=1while x<=10: print x x+=1 name=''while not name: name=raw_input('enter your name:') print 'Hello,%s!'%name #Hello,ming! 5.2.for 循环 names=['ming','hong','qiang','qing']for n in names: print n print range(10) #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] rang(0,10)for num in range(1,10): print num 5.3.循环遍历字典元素 d={'x':1,'y':2,'z':3}for key in d: print key,d[key] #y 2 x 1 z 3 5.4.一些迭代工具 5.4.1 并行迭代 names=['ming','hong','qiang','qing']ages=[10,11,12,13]for i in range(len(names)): print names[i],'is',ages[i],'years old' #ming is 10 years old... print zip(names,ages) #[('ming', 10), ('hong', 11), ('qiang', 12), ('qing', 13)] 将两个序列压缩,返回一个元组的列表for n,a in zip(names,ages): print n, 'is',a, 'years old' #ming is 10 years old... 5.4.2按索引迭代 5.4.3翻转和排序迭代 5.5.跳出循环 5.5.1break from math import sqrtfor n in range(99,0,-1): print n root=sqrt(n) if root==int(root): print "the biggst is %s"%n break 5.5.2 continue 5.5.3 while True/break while True: word=raw_input('Please enter a word:') if not word:break print 'The word was '+word 5.6 循环体中的else子句 from math import sqrtfor n in range(99,80,-1): print n root=sqrt(n) if root==int(root): print "the biggst is %s"%n break else: print "didn't find it" 6 列表推导式-轻量级循环:利用其它列表创建新列表 print [x*x for x in range(10)] #[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]print [x*x for x in range(10) if x%3==0] #[0, 9, 36, 81]print [(x,y,z) for x in range(2) for y in range(2) for z in range(2)] [(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1)] 7 三个语句:pass,del,exec 7.1 pass : 7.2 del:删除不再使用的对象 7.3 exec:执行一系列Py语句 exel:计算Py表达式,并且返回结果值

xuning715 2019-12-02 01:10:20 0 浏览量 回答数 0

回答

您可以利用短路all并any改善性能: list1 = ['data mining', 'data sources', 'data']list2 = ['neural networks', 'deep learning', 'machine learning']sentences = ["mining data using neural networks has become a trend", "data mining is easy with python", "machine learning is my favorite", "data mining and machine learning are awesome", "data sources and data can been used for deep learning purposes", "data, deep learning and neural networks"] for sentence in sentences: if all(any(term in sentence for term in lst) for lst in (list1, list2)): print(sentence) 集合比列表更有效。如果要查找包含两个列表中单个单词的句子,您可以&使用两个“列表” 检查每个句子的intersection(),而不是使用嵌套循环: list1 = set(list1)list2 = set(list2)[sentence for sentence in set(sentences.split()) if sentence & list1 & list2]但是,由于您的列表似乎包含短语(或单词序列),因此可能很难避免使用多个循环。如果找到或找不到匹配项,您至少可以中断或继续循环。也没有必要在彼此之间嵌套您要匹配的两个列表的循环。 result = []for sentence in sentences: for word in list1: if word in sentence: break else: continue for word in list2: if word in sentence: break else: continue result.append(sentence) 结果: ['mining data using neural networks has become a trend', 'data mining and machine learning are awesome', 'data sources and data can been used for deep learning purposes', 'data, deep learning and neural networks']

一码平川MACHEL 2019-12-02 01:54:08 0 浏览量 回答数 0

回答

Java break语句可以直接强行退出当前的循环,忽略循环体中任何其他语句和循环条件测试。 使用了break关键字来跳出当前循环: 公共类主要{ 公共静态无效主(字符串[ ] ARGS ){ INT [ ] intary = { 99 ,12 ,22 ,34 ,45 ,67 ,5678 ,8990 } ; 诠释没有= 5678 ; int i = 0 ; 发现的布尔值= 否 ; 为(; 我< intary 。长度; 我++ ){ 如果(intary [ 我] == 没有){ 发现= 真; 休息; } } if (找到){ 系统。出来。println (no + “ 元素的索引位置在:” + i ); } else { 系统。出来。println (no + “ 元素不在数组中” ); } } } 以上代码运行输出结果为: 5678元素的索引位置在:6

珍宝珠 2020-02-12 19:59:00 0 浏览量 回答数 0

问题

在JAVA中如何跳出当前的多重嵌套循环?

YDYK 2020-04-25 13:33:07 0 浏览量 回答数 1

回答

for 循环 本系列前面 “探索 Python,第 5 部分:用 Python 编程” 一文讨论了 if 语句和 while 循环,讨论了复合语句以及适当缩进 Python 语句来指示相关 Python 代码块。该文的结尾介绍了 Python for 循环。但就其使用和功能来说,for 循环更值得关注,所以本文单独讲述该循环。 for 循环有一个简单的语法,使您可以从容器对象中提取单个项目并对其进行某些操作。简单地说,使用 for 循环,可以迭代中对象集合的项目。对象集合可以是任何 Python 容器类型,包括前面文章中讨论的 tuple、string 和 list 类型。但是容器 metaphor 的功能比这三种类型更强大。metaphor 包括其他序列类型,如 dictionary 和 set,将来的文章中将对它们进行讨论。 但是请稍等!还有更多信息:for 循环可以用于迭代支持迭代 metaphor 的任何对象,这使 for 循环非常有用。 清单 1 中显示了 for 循环的基本语法,还演示了如何在 for 循环中使用 continue 和 break 语句。 清单 1. for 循环的伪代码 ? 12345678910111213 for item in container: if conditionA: # Skip this item continue elif conditionB: # Done with loop break # action to repeat for each item in the container else: # action to take once we have finished the loop. 本系列中的第二篇文章 “探索 Python,第 2 部分:探索 Python 类型的层次结构” 介绍了 Python tuple。如文中所述,tuple 类型是不可变的异构容器。这主要是说 tuple 可以存放不同类型的对象,但是它一旦创建,就无法更改。清单 2 演示了如何使用 for 循环迭代 tuple 的元素。 清单 2. for 循环和 tuple ? 1234567891011121314151617 t = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9) count = 0for num in t: ... count += num... else:... print count... 45 count = 0for num in t: ... if num % 2:... continue... count += num... else:... print count... 20 本例首先创建了名为 t 的 tuple,存放整数 0 至 9(包含 9)。第一个 for 循环迭代此 tuple,在 count 变量中累计 tuple 中数值的和。一旦代码已经迭代了 tuple 中的所有元素,它将进入 for 循环的 else 子句,打印 count 变量的值。 清单 2 中显示的第二个 for 循环也迭代 tuple 中的所有元素。但是,它仅累计容器中能够被 2 整除的那些项的值(请记住如果表达式为非零,if 语句将确定为真,num 不能被 2 整除时使用 % 运算符会返回非零值)。此限制通过使用适当的 if 语句和 continue 语句来完成。如前面的文章中所述,continue 语句使包含它的循环开始下一次迭代。实现相同结果的另一种方法是测试 tuple 中的当前项是否是偶数(使用 if not num % 2:),如果为真,那么将当前项添加到运行总和中。一旦代码完成 tuple 中的迭代,将调用 else 子句,打印总和。 本系列中的第三篇文章 “探索 Python:第 3 部分:探索 Python 类型的层次结构” 讨论了 Python string。string 是不可变的同构容器,这意味着它仅能存放字符且一旦建立将无法修改。清单 3 演示了如何使用 Python string 作为 for 循环的容器。 清单 3. for 循环和 string ? 123456789101112131415161718192021 st = "Python Is A Great Programming Language!"for c in st: ... print c,... P y t h o n I s A G r e a t P r o g r a m m i n g L a n g u a g e ! count = 0for c in st: ... if c in "aeiou":... count += 1... else:... print count...10 count = 0for c in st.lower(): ... if c in "aeiou":... count += 1... else:... print count... 12 本例提供了三个不同的 for 循环,它们都迭代同一 string。第一个 for 循环迭代 string “Python Is A Great Programming Language!” 并一次打印 string 中的一个字符。在此例中,print 语句变量 c 后加了一个逗号。这使 print 语句打印字符值时后面跟着空格字符,而不是换行字符。如果没有后面的逗号,字符将全部打印在单独的行中,会很难读。 下两个 for 循环迭代该字符串并计算其包含多少个元音字母(“a”、“e”、“i”、“o” 或 “u”)。第二个 for 循环在迭代原始 string 时仅查找小写元音字母。第三个 for 循环迭代通过调用 string 对象的 lower 方法返回的临时 string。lower 方法将 string 中的所有字符转换为小写。因此,第三个 for 循环可找到另外两个元音字母。 本系列中的第四篇文章 “探索 Python,第 4 部分:探索 Python 类型的层次结构” 介绍了 Python list。list 是异构可变容器,这意味着它可以存放不同类型的对象且创建后可以修改。清单 4 演示了如何使用 list 和 for 循环。 清单 4. for 循环和 list ? 12345678910 mylist = [1, 1.0, 1.0j, '1', (1,), [1]]for item in mylist: ... print item, "t", type(item))... 1 1.0 1j 1 (1,) [1] 既然 list 是很灵活的 Python 容器类型(您将在本系列其余的文章中多次看到它),本例看起来可能过于简单了。但是,这是一部分要点:使用 for 循环使处理容器中的每个项目非常简单,甚至处理包含各种不同对象的 list 也是如此。本例迭代 Python list 中的所有项目,并在单独的行中打印每一项及其相对应的 Python 类型。 迭代和可变容器 Python list 是一个可变序列,提供了一种令人好奇的可能性:for 循环主体可以修改其正在迭代的 list。正如您可能认为的,这样并不好,如果进行此操作,Python 解释器将无法很好地工作,如清单 5 所示。 清单 5. 在 for 循环中修改容器 ? 1234567891011121314151617 mylist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]for item in mylist: ... if item % 2:... mylist.insert(0, 100)... ^CTraceback (most recent call last): File "", line 3, in ?KeyboardInterrupt print mylist [100, ...., 100, 100, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # Many lines deleted for clarity mylist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]for item in mylist[:]: ... if item % 2:... mylist.insert(0, 100)... print mylist [100, 100, 100, 100, 100, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 本例中的第一个 for 循环只要在原始 list 中发现奇数,它就在 list 的开始插入数值 100。当然,这是一种演示此问题的不同寻常的方式,但却非常好。一旦在三个点的 Python 提示后按 Enter 键,Python 解释器就处于无限循环的混乱中。要停止这种混乱,必须通过按 Ctrl-C(其在 Python 输出中显示为 ^C)来中断进程,然后会出现 KeyboardInterrupt 异常。如果打印出修改的 list,将看到 mylist 现在包含大量的值为 100 的元素(新元素的准确数量取决于您中断循环的速度)。 本例中的第二个 for 循环演示了如何避免此问题。使用切片运算符创建原始 list 的副本。现在 for 循环将迭代该副本,而对原始 list 进行修改。最终的结果是修改后的原始 list,它现在以五个值为 100 的新元素开始。 for 循环和序列索引 如果您用过其他编程语言,Python for 循环可能看起来有点儿古怪。您可能认为它更像 foreach 循环。基于 C 的编程语言具有 for 循环,但它的设计目的是对一系列操作执行特定次数。Python for 循环可以通过使用内置的 range 和 xrange 方法来模拟该行为。清单 6 中演示了这两种方法。 清单 6. range 和 xrange 方法 ? 12345678910 r = range(10)print r [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] type(r) xr = xrange(10)print xr xrange(10) type(xr) 本例首先演示了 range 方法,它创建一个包含一系列整数的新 list。调用 range 方法的一般形式是提供单个值,用作整数 list 的上限。零为起始值。因此,调用 range(10) 将创建包含整数 0 至 9(包含 9)的 list。range 方法接受起始索引以及步长。所以,调用 range(11,20) 将创建从 11 至 19(包含 19)的整数 list,而调用 range(12, 89, 2) 将创建从 12 至 88 的偶数 list。 由于 xrange 方法也创建整数 list(其使用相同参数),所以它与 range 方法非常相似。但是,xrange 方法仅在需要时才在 list 中创建整数。例如,在清单 6 中,尝试打印出新创建的 xrange 时除了 xrange 的名称,不会显示任何数据。当需要迭代大量整数时,xrange 方法更适用,因为它不会创建极大的 list,那样会消耗大量计算机内存。 清单 7 演示了如何在 for 循环内使用 range 方法来创建整数 1 至 10(包含 10)的乘法表。 清单 7. 创建乘法表 ? 123456789101112131415 for row in range(1, 11): ... for col in range(1, 11):... print "%3d " % (row * col),... print... 1 2 3 4 5 6 7 8 9 10 2 4 6 8 10 12 14 16 18 20 3 6 9 12 15 18 21 24 27 30 4 8 12 16 20 24 28 32 36 40 5 10 15 20 25 30 35 40 45 50 6 12 18 24 30 36 42 48 54 60 7 14 21 28 35 42 49 56 63 70 8 16 24 32 40 48 56 64 72 80 9 18 27 36 45 54 63 72 81 90 10 20 30 40 50 60 70 80 90 100 本例使用两个 for 循环,外面的 for 循环关注乘法表中的每一行,嵌套的 for 循环关注每行内的列。每个循环都迭代包含整数 1 至 10(包含 10)的 list。最里面的 print 语句使用了一个名为 字符串格式化 的新概念来创建格式设置精美的表。字符串格式化是一种非常有用的技术,用于以格式设置精美的布局创建由不同数据类型组成的 string。现在详细信息并不重要,将来的文章中将讲述这些内容(了解 C 编程语言的 printf 方法的任何人都会很熟悉这些内容)。在本例中,字符串格式化指定将从整数创建新 string 且需要保留三个字符来存放该整数(如果该整数小于三个字符,将在左边用空格填补,从而使数据排列整齐)。第二个 print 语句用于打印新行,从而使乘法表中的下一行被打印在新的行中。 range 方法还可用于迭代容器,通过使用适当的索引访问序列中的每一项。要进行此操作,需要包含容器的允许范围索引值的整数 list,这可以通过使用 range 方法和 len 方法来轻松实现,如清单 8 所示。 清单 8. 在 for 循环内索引容器 ? 1234567891011121314 st = "Python Is A Great Programming Language!"for index in range(len(st)): ... print st[index],... P y t h o n I s A G r e a t P r o g r a m m i n g L a n g u a g e ! for item in st.split(' '): ... print item, len(item)... Python 6Is 2A 1Great 5Programming 11Language! 9 这个最后的示例演示了如何使用 len 方法作为 range 方法的参数,创建可用于单独访问 string 中每个字符的整数 list。第二个 for 循环还显示了如何将 string 分割为子字符串的 list(使用空格字符来指示子字符串的边界)。for 循环迭代子字符串 list,打印每个子字符串及其长度。

xuning715 2019-12-02 01:10:25 0 浏览量 回答数 0

回答

<script type="text/javascript"> var str = prompt("请输入要加密的字符串:").split(""); var newStr = []; //小写字母表 var smallAlphabet = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]; //大写字母表 var capitalAlphabet=["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","V","U","W","X","Y","Z"]; for (var n=0; n < str.length; n++) loop_1: for (var i=0; i<=25; i++) switch (true) { case str[n] == smallAlphabet[i] && i+5<=25: newStr[n] = smallAlphabet[i+5]; break loop_1 ; case str[n] == smallAlphabet[i] && i+5 >25: newStr[n] = smallAlphabet[i+5-26]; break loop_1 ; case str[n] == capitalAlphabet[i] &&i+5 <= 25: newStr[n] = capitalAlphabet[i+5]; break loop_1 ; case str[n] == capitalAlphabet[i] && i+5 >25: newStr[n] = capitalAlphabet[i+5-26]; break loop_1 ; //如果str[]既不在小写字母表中,也不在大写字母表中 case str[n]!=smallAlphabet[i]&&str[n]!=capitalAlphabet[i]: newStr[n]=str[n]; break; } alert("加密后的新字符串是:" + newStr.join("")); </script> 问题不是你那段代码写错了,而是被执行了太多次了你可以试试直接输入一个z,它就会正常显示,在你之前的代码里break只是跳出选择但并没有跳出循环,这样你最后那段代码在每次里层循环会被执行25次,这样你前面得到的结果就被后面的覆盖掉了,所以效果就是没有加密成功。打个比方 当你输入a的时候,第一次会被第一个case执行newStr[0]=f,但是它跳出了switch而没有跳出循环,这样就会继续循环下去,当进行第二次判断的时候a就满足了最后那行代码这时候newStr[0]原来的值就被重新覆盖掉了又变回了a,所以你最后得到的结果还是a,除非你输入的是z他最后一次执行的时候会被第一个case执行从而在最后一次被覆盖成正确的值,你之前不是问过有关console.log()的使用么,用它查看每次循环后newStr[n]的值这样你就能知道错在哪了。我改的这个代码的目的是让他在找到对应的case(除最后一个)后就跳出里层的循环这样得到的结果就不会被覆盖掉了

小旋风柴进 2019-12-02 02:11:48 0 浏览量 回答数 0

回答

Java 7中,switch的参数可以是String类型了,这对我们来说是一个很方便的改进。到目前为止switch支持这样几种数据类型:byte short int char String 。但是,作为一个程序员我们不仅要知道他有多么好用,还要知道它是如何实现的,switch对整型的支持是怎么实现的呢?对字符型是怎么实现的呢?String类型呢?有一点Java开发经验的人这个时候都会猜测switch对String的支持是使用equals()方法和hashcode()方法。那么到底是不是这两个方法呢?接下来我们就看一下,switch到底是如何实现的。 一、switch对整型支持的实现 下面是一段很简单的Java代码,定义一个int型变量a,然后使用switch语句进行判断。执行这段代码输出内容为5,那么我们将下面这段代码反编译,看看他到底是怎么实现的。 public class switchDemoInt { public static void main(String[] args) { int a = 5; switch (a) { case 1: System.out.println(1); break; case 5: System.out.println(5); break; default: break; } } } //output 5 反编译后的代码如下: public class switchDemoInt { public switchDemoInt() { } public static void main(String args[]) { int a = 5; switch(a) { case 1: // '\001' System.out.println(1); break; case 5: // '\005' System.out.println(5); break; } } } 我们发现,反编译后的代码和之前的代码比较除了多了两行注释以外没有任何区别,那么我们就知道,switch对int的判断是直接比较整数的值。 二、switch对字符型支持的实现 直接上代码: public class switchDemoInt { public static void main(String[] args) { char a = 'b'; switch (a) { case 'a': System.out.println('a'); break; case 'b': System.out.println('b'); break; default: break; } } } 编译后的代码如下: `public class switchDemoChar public class switchDemoChar { public switchDemoChar() { } public static void main(String args[]) { char a = 'b'; switch(a) { case 97: // 'a' System.out.println('a'); break; case 98: // 'b' System.out.println('b'); break; } } } 通过以上的代码作比较我们发现:对char类型进行比较的时候,实际上比较的是ascii码,编译器会把char型变量转换成对应的int型变量 三、switch对字符串支持的实现 还是先上代码: public class switchDemoString { public static void main(String[] args) { String str = "world"; switch (str) { case "hello": System.out.println("hello"); break; case "world": System.out.println("world"); break; default: break; } } } 对代码进行反编译: public class switchDemoString { public switchDemoString() { } public static void main(String args[]) { String str = "world"; String s; switch((s = str).hashCode()) { default: break; case 99162322: if(s.equals("hello")) System.out.println("hello"); break; case 113318802: if(s.equals("world")) System.out.println("world"); break; } } } 看到这个代码,你知道原来字符串的switch是通过equals()和hashCode()方法来实现的。记住,switch中只能使用整型,比如byte。short,char(ackii码是整型)以及int。还好hashCode()方法返回的是int,而不是long。通过这个很容易记住hashCode返回的是int这个事实。仔细看下可以发现,进行switch的实际是哈希值,然后通过使用equals方法比较进行安全检查,这个检查是必要的,因为哈希可能会发生碰撞。因此它的性能是不如使用枚举进行switch或者使用纯整数常量,但这也不是很差。因为Java编译器只增加了一个equals方法,如果你比较的是字符串字面量的话会非常快,比如”abc” ==”abc”。如果你把hashCode()方法的调用也考虑进来了,那么还会再多一次的调用开销,因为字符串一旦创建了,它就会把哈希值缓存起来。因此如果这个switch语句是用在一个循环里的,比如逐项处理某个值,或者游戏引擎循环地渲染屏幕,这里hashCode()方法的调用开销其实不会很大。 好,以上就是关于switch对整型、字符型、和字符串型的支持的实现方式,总结一下我们可以发现,其实switch只支持一种数据类型,那就是整型,其他数据类型都是转换成整型之后在使用switch的。

montos 2020-06-01 21:32:37 0 浏览量 回答数 0

问题

当stream = True但数据并不总是流入时,我如何退出Python请求get

kun坤 2019-12-29 21:50:56 0 浏览量 回答数 1

回答

for循环和forEach方法之间最实质的区别在于,对于前者,您可能会break跳出循环。您可以continue通过简单地从传递给的函数返回来进行模拟forEach,但是无法完全停止循环。 除此之外,两者有效地实现了相同的功能。由于变量提升,另一个小差异涉及for循环中索​​引的范围(以及所有包含变量的范围)。 // 'i' is scoped to the containing function for (var i = 0; i < arr.length; i++) { ... } // 'i' is scoped to the internal function arr.forEach(function (el, i) { ... }); 但是,我发现它forEach更具表现力-它表示您遍历数组的每个元素的意图,并且为您提供了对该元素的引用,而不仅仅是索引。总体而言,它主要取决于个人喜好,但是如果可以使用forEach,我建议您使用它。 这两个版本之间还有一些实质性差异,特别是在性能方面。实际上,forEach如本jsperf测试所示,简单的for循环的性能要比方法好得多。 是否需要这种性能取决于您自己决定,在大多数情况下,我倾向于表现力胜于速度。此速度差异可能是由于在稀疏数组上进行操作时基本循环与方法之间的较小语义差异所致,如本答案所述。 如果您不需要行为forEach和/或需要尽早突破循环,则可以使用Lo-Dash _.each作为替代,它也可以跨浏览器工作。如果您使用的是jQuery,它还提供了一个类似的$.each,只需注意每个变体中传递给回调函数的参数的差异。 (对于forEachpolyfill,如果您选择使用那条路线,它应该可以在较旧的浏览器中正常工作。)

保持可爱mmm 2020-02-08 13:51:16 0 浏览量 回答数 0

回答

什么是质数:质数(Prime number),又称素数,指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数(也可定义为只有1与该数本身两个因数的数)。——via维基百科简单来说就是,只能除以1和自身的数(需要大于1)就是质数。举个栗子,5这个数,从2开始一直到4,都不能被它整除,只有1和它本身(5)才能被5整除,所以5就是一个典型的质数。那么想计算出一个随机数是不是质数用Python应该怎么写呢?首先第一句话肯定是接受用户输入的数字:n = int(input("please enter the number:"))接着要计算该数是不是质数,那么就要从2开始一直除到该数之前的那个自然数,很明显是一个数字范围:for i in range(2, n):在循环体里面,每次循环当然就是要判断当次除法是否是整除,这里可以使用求模运算,也就是取余,当余数为0时,该数就不是质数:if n % i == 0: print("%d is not a prime number!" % n) break这个break意思就是当该数不是质数时,就跳出整个循环,该数就不是我们要的数字了。那么,所有循环迭代都完成后还没有找出能整除的情况的话,那么可以判断该数就是一个质数,所以:else: print("%d is a prime number!" % n)那么此时,所有代码就写好了,不过为了看起来简单,没有罩一层是否大于1的判断,用户输入的数字默认需要大于1:n = int(input("please enter the number:"))for i in range(2, n): if n % i == 0: print("%d is not a prime number!" % n) breakelse: print("%d is a prime number!" % n)这里要细细品味这段代码,else其实不是和if是一对,而是和for并排的,我们常见的是if…else…或者if…elif…else诸如此类,但其实for也可以和else搭配出现,在这段代码里,当某一次遍历结果余数为0后,break生效,那循环就结束了,那与之成对出现的else代码也就不执行了;当所有遍历结束后没有一次余数为0,那该循环就转到else开始执行,打印输出“该数为质数”。最后我们来随便输2个数字看看功能有没有实现:please enter the number:1111 is a prime number! please enter the number:2121 is not a prime number!

世事皆空 2019-12-02 01:07:38 0 浏览量 回答数 0

回答

有没有内置的能力break的forEach。要中断执行,您将必须抛出某种异常。例如。 var BreakException = {}; try { [1, 2, 3].forEach(function(el) { console.log(el); if (el === 2) throw BreakException; }); } catch (e) { if (e !== BreakException) throw e; } JavaScript异常不是很漂亮。for如果您确实需要传统循环,则传统循环可能更合适break。 采用 Array#some 而是使用Array#some: [1, 2, 3].some(function(el) { console.log(el); return el === 2; }); 这工作,因为some回报率true只要任何回调,在排列顺序,返回执行true,短路,其余的执行。 some,它的反函数every(将在上停止return false),以及forEach所有ECMAScript Fifth Edition方法,都需要将它们添加到Array.prototype缺少它们的浏览器中。 问题来源于stack overflow

保持可爱mmm 2020-01-08 16:54:34 0 浏览量 回答数 0

问题

如何使用Python中的break语句退出嵌套for循环

游客6qcs5bpxssri2 2019-12-01 19:55:47 14 浏览量 回答数 2

回答

知道汉诺塔的递归程序的意思吗 就是先控制一个不动,让剩余的排列好,然后再移动第一个,再排列好剩余的 这个程序也是这个意思 举个例子说 1234 1。先保持1不动,排列234 2。保持2不动,排列34 3。保持3不动,排列4 4。得到4;输出1234。 5。然后跳转到3,将3与4互换, 6。得到3;输出1243。 7。跳转到2,将2与3互换, 8。重复3-6,得1324,1342。 9。跳转到2,将2与4互换,得到1423,1432。 以下省略若干步。。 最后就得到全排列 解答完毕 一个比较好的全排列算法(C语言) -|killniu 发表于 2006-4-18 23:39:00 我有一个比较好的全排列算法,我验证了3、4、5的结果是正确的。 程序中没有使用递归,只是几个循环,速度还令人满意。 在C466A,Win2000的机器上,进行8个数字的全排列,结果不显示,重定向到一个文本文件中,耗时不到一秒钟 。9个数字的全排列耗时6秒种。10个数字的全排列55秒种。(以上都不显示结果,均重定向到一个文本文件) 11个数字的全排列(不显示结果,在原程序中不定义ISPRINT)耗时大约16秒钟。 。 欢迎各位指点 算法为:用两个数组,一个数组存放当前结果,第二个数组是每一个数是否已经使用的标志。比如对10个数进 行全排列,第一个结果是:0 1 2 3 4 5 6 7 8 9。 然后把每一个数的使用标志均置为1。 然后开始主循环: 先打印当前的结果。 在前一个得到的结果中,从后往前找第一个由小到大排列的数。每找一次均置当前位上的数字的使用标志 为0,然后找第一个比这个数大但是没有使用过的数。 比如前一个结果是:4 1 9 7 8 2 5 0 6 3,那么从后往前第一个由小到大排列的数是0,第一个比0大但是没有 使用过的数是3(因为比0大的数字里只有6和3)。最后由小到大依次打印剩余没有使用过的数字。所以下一个 结果是4 1 9 7 8 2 5 3 0 6。 源程序为(在BC++3.0下编译成功): #i nclude<stdio.h>/*这两个库函数是习惯性的加上去的^_^。*/ #i nclude<stdlib.h> #define ISPRINT/*是否打印结果的标志*/ #define MAX 200/*最大的数*/ unsigned int *_NUM;/*用于存放一条结果的数组指针*/ char *_NUMFLAG;/*用于存放是否已经使用的标志*/ #define NUM(j) (*(_NUM+(j)))/*第j位的数字*/ #define NUMFLAG(j) (*(_NUMFLAG+(j)))/*数字j是否已经使用的标志,0为没有使用,1为已经使用*/ #define NUMUSE(j) (*(_NUMFLAG+(*(_NUM+(j)))))/*第j位上的数字是否已经使用的标志,0为没有使用,1为已 经使用*/ void main() { unsigned int number,j; int i; printf(" Input number=");scanf("%u",&number); if((number>=MAX)||(number<=1)){puts("输入数据错误。");exit(-1);} /*初始化内存和第一个结果*/ _NUM=(unsigned int*)malloc(sizeof(unsigned int)*number); if(!_NUM){puts("分配给_NUM出现内存不足");exit(-1);} _NUMFLAG=(char*)malloc(sizeof(char)*number); if(!_NUMFLAG){puts("分配给_NUMFLAG出现内存不足");exit(-1);} for(i=0;i<number;i++)NUM(i)=i,NUMFLAG(i)=1;/*初始化第一条结果和使用标志*/ do{/*主循环*/ #ifdef ISPRINT/*打印结果*/ for(j=0;j<number;j++)printf("%d ",NUM(j));/*打印一条结果。*/ puts("");/*并换行*/ #endif NUMUSE(number-1)=0;//置最后一位数字的使用标志为0. /*在前一个结果中从后往前寻找第一个从小到大排列的数,并存放到变量j中*/ for(i=number-2;i>=0;i--){ NUMUSE(i)=0; if(NUM(i)<NUM(i+1))break; } if(i<0)break;/*从这里退出主循环.*/ for(j=NUM(i)+1;j<number;j++){ if(!NUMFLAG(j))break; } NUMFLAG(j)=1; NUM(i)=j; for(j=0,i++;i<number;j++) if(!NUMFLAG(j))NUM(i++)=j,NUMFLAG(j)=1; }while(1); /*释放内存*/ free(_NUM); free(_NUMFLAG); } /*程序结束*/ 当然了这个程序的速度并不是最快的,程序中还有很大的优化余地,还可以减少一些循环,或者采用其他更好的算法。 下载源程序http://263.csdn.net/FileBBS/files/2001_8/T_387_1.zip

琴瑟 2019-12-02 01:24:37 0 浏览量 回答数 0

回答

目前,您的代码在while循环之外实例化datetime。这意味着每次您向输入字段中输入一个新字符串时,它将获取预先设置的日期时间,而不是创建一个新字符串。简单解决办法: from datetime import datetime def status(): all_status_updates = [] while True: stat = input("Type Status Update Here...\n") if stat != "exit": today = datetime.now().strftime("%d/%m/%Y %H:%M:%S") all_status_updates.extend((today, stat)) print(all_status_updates[::-1]) elif stat == "exit": break status() 我还添加了.strftime("%d/%m/%Y %H:% m:%S")后缀,使datetime更易于阅读。你可以根据自己的需要修改这些修改器。 在上面的代码示例中,只有在用户输入一个非“exit”的文本字符串时才调用datetime。你也可以把它放到while循环的主体中,但是大多数时候它都不会被使用。

kun坤 2019-12-27 11:23:27 0 浏览量 回答数 0

问题

【精品问答】前端实战100例之JavaScript篇

珍宝珠 2020-02-14 15:10:56 1456 浏览量 回答数 1

问题

Java中volatile的疑问

蛮大人123 2019-12-01 20:07:43 1068 浏览量 回答数 1

回答

不良的编程习惯TOP1:粘贴复制 在学生时代,我们都知道抄袭是不对的。但在工作中,这方面的规则还很模糊。虽然有些代码块是不能盗用的——不要把专有代码拷贝到你的堆栈中,尤其是这些代码有标记版权信息。这种时候你应该编写自己的版本,老板付你薪水就是要做正事的。 但是当原始创作者想要共享代码时,问题就变得复杂了。这些共享代码也许放到了某个在线编程论坛上,也许它们是带有许可证(BSD,MIT)的开放源代码,允许使用一到三个函数。你使用这些共享代码是没有问题的,而且你上班是为了解决问题,而不是重新发明轮子。 大多数情况下,复制代码的优势非常明显,小心对待的话问题也不大。至少那些从靠谱的来源获得的代码已经被大致“检查“过了。 问题的复杂之处在于,这些共享代码是否存在一些未发现的错误,代码的用途或底层数据是否存在一些特别的假设。也许你的代码混入了空指针,而原始代码从未检查过。如果你能解决这些问题,那么就可以理解为你的老板得到了两位程序员共同努力的成果。这就是某种形式的结对编程,而且用不着什么高大上的办公桌。 不良的编程习惯TOP2:非函数式代码 在过去十年间,函数范式愈加流行。喜欢用嵌套函数调用来构建程序的人们引用了很多研究成果。这些研究表明,与旧式的变量和循环相比,函数式编程代码更安全,错误更少,而且可以随程序员的喜好任意组合在一起。粉丝们十分追捧函数式编程,还会在代码审查和拉取请求中诋毁非函数式方法。关于这种方法的优势,他们的观点其实并没有错。 但有时你需要的仅仅是一卷胶带而已。精心设计并细心计划的代码需要花费很多时间,不仅需要花费时间想象,还需要构建和之后导航的时间。这些都增加了复杂性,并且会花费很多的时间与精力。开发漂亮的函数式代码需要提前做计划,还要确保所有数据都通过正确的途径传递。有时找出并更改变量会简单得多,可能再加个注释说明一下就够了。就算要在注释中为之后的程序员致以冗长而难懂的歉意,也比重新设计整个系统,把它扳回正轨上要省事得多。 不良的编程习惯第 3 位:非标准间距 软件中的大多数空格都不会影响程序的性能。除少数使用间距指示代码块的语言(如 Python)外,大多数空格对程序行为的影响为零。尽管如此,仍然有一些得了强迫症的程序员会数空格,并坚持认为它们很重要。曾有这样一位程序员以最严肃的口吻告诉我的老板,说我正在写“非标准代码”,还说他一眼就看出来了。我的错咯?因为我没在等号的两侧放置空格,违反了 ESLint space-infix-ops 规则[1]。 有时候你只要操心那些更深层的内容就行了,谁管什么空格的位置。也许你担心数据库过载,也许你担心空指针可能会让你的代码崩溃。一套代码中,几乎所有的部分都比空格更重要,就算那些喜欢走形式的标准委员会写出来一大堆规则来限制这些空格或制表符的位置,那又如何呢。 令人欣喜的是,网上可以找到一些很好用的工具来自动重新格式化你的代码,让你的代码遵守所有精心定义的 linting 规则。人类不应该在这种事情上浪费时间和脑细胞。如果这些规则这么重要,我们就应该用工具来解决这些问题。 不良的编程习惯第 4 位:使用 goto 禁止使用 goto 的规则可以追溯到许多结构化编程工具还没有出现的时代。如果程序员想创建一个循环或跳转到另一个例程,则需要键入 goto,后跟一个行号。多年之后,编译器团队开始允许程序员使用字符串标签来代替行号。这在当时被认为是一项热门的新特性。 有的人把这样做法的结果称为“意大利面条式代码”。因为以后没人能读懂你的代码,没人搞得清楚执行路径。成为一团混乱的线程,缠结在一起。Edsger Dijkstra 写过一篇题为“我们认为 goto 声明是有害的”的一篇文章[2],号召大家拒绝使用这个命令。 但是绝对分支并不是问题所在,问题在于它产生的那堆纠缠的结果。一般来说,精心设计的 break 或 return 能提供有关该位置的代码执行情况的非常清晰的陈述。有时,将 goto 添加到一个 case 语句中所生成的东西与联 if-then-else 块的相比,结构更正确的列表理解起来更容易。 也有反例。苹果 SSL 堆栈中的“goto fail”安全漏洞[3]就是一个很好的例子。但是,如果我们谨慎地避免 case 语句和循环中出现的一些问题,我们就可以插入很好用的绝对跳转,使代码读者更容易理解正在发生的事情。有时我们可以放一个 break 或 return,不仅更简洁,而且大家读起来更愉快,除了那些讨厌 goto 的人们。 不良的编程习惯第 5 位:不声明类型 热爱类型化语言的人们有他们的理由。当我们为每个变量的数据类型添加清晰的声明时,我们会编写更好,错误更少的代码。花点时间来阐明类型,就可以帮助编译器在代码开始运行之前标记出愚蠢的错误。这可能会很痛苦,但也会有回报。这是一种编程的笨办法,就是为了避免错误。 时代变了。许多较新的编译器已经足够聪明了,它们可以在查看代码时推断出类型。它们可以在代码中前后移动,最后确认变量应该是 string 或 int,抑或是其他类型。而且,如果推断出来的这些类型没法对齐,则编译器会给出错误标志。它们不需要我们再类型化变量了。 换句话说,我们可以省略一些最简单的声明,然后就能轻松节省一些时间了。代码变得更简洁,代码读者也往往能猜出 for 循环中名为 i 的变量是一个整数。 不良的编程习惯第 6 位:溜溜球代码 程序员喜欢将其称为“yo-yo 代码”。首先,这些值将存储为字符串,然后将它们解析为整数,接下来将它们转换回字符串。这种方法效率极低。你几乎能感受到一大堆额外负载让 CPU 不堪重负的样子。能快速编写代码的聪明程序员会调整自己的代码架构,以最大程度地减少转换。因为他们安排好了计划,他们的代码也能跑得更快。 但不管你信不信,有时溜溜球代码也是有意义的。有的时候,你需要用一个可以在自己的黑匣子里搞定一大堆智能操作的库。有的老板花了很多钱,请好多天才做出来这么一个库。如果这个库需要字符串形式的数据,那么你就得给它字符串,就算你最近刚把数据转换为整数也得再转回去。 当然,你可以重写所有代码以最大程度地减少转换,但这会花费一些时间。有时,代码多运行一分钟、一小时、一天甚至一周也是可以接受的,因为重写代码会花费更多时间。有时候,增加技术债务要比重新建立一笔技术债的成本更低些。 有时这种库里面不是专有代码,而是你很久以前编写的代码。有时,转换一次数据要比重写该库中的所有内容更省事。这种时候你就可以编写悠悠球代码了,不要怕,我们都遇到过这种事情。 不良的编程习惯第7位:编写自己的数据结构 有一条标准规则是,程序员在大二学完数据结构课程后,再也不要编写用于存储数据的代码了。已经有人编写过了我们所需要的所有数据结构,并且他们的代码经过了多年的测试和重新测试。这些结构与语言打包在一起,还可能是免费的。你自己写的代码只会是一堆错误。 但有的时候数据结构库的速度有点缓慢。有时候我们被迫使用的标准结构并不适合我们自己的代码。有时,库会要求我们在使用它的结构之前重新配置数据。有时,这些库带有笨重的保护,还有一些诸如线程锁定之类的特性,而我们的代码并不需要它们。 发生这种情况时就该编写我们自己的数据结构了。有时我们自己的结构会快很多,还可能让我们的代码更整洁,因为我们不需要一大堆额外的代码来重新精确地格式化数据。 不良的编程习惯第 8 位:老式循环 很久以前,创建 C 语言的某人想将所有抽象可能性封装在一个简单的构造中。这个构造开始时要做一些事情,每次循环都要做一些事情,所有事情都完成时还有一些方法来提示我们。当时,这似乎是一种拥有无限可能性的完美语法。 此一时彼一时,如今一些现代评论者只看到了其中的麻烦,发生的事情太多了,所有这些可能性既可能向善也可能作恶。这种构造让阅读和理解代码变得非常困难。他们喜欢更加函数式的的范式,其中没有循环,只有应用到列表的函数,还有映射到某些数据的计算模板。 有时无循环方法更简洁,尤其是当我们只有一个简单的函数和一个数组的时候。但还有些时候,老式的循环要简单得多,因为它可以做更多事情。例如,当你找到第一个匹配项后就立刻停止搜索,这样的代码就简单得多。 此外,要对数据执行多项操作时,映射函数会要求更严格的编码。假设你要对每个数字取绝对值,然后取平方根,最快的方案是先映射第一个函数,然后映射第二个函数,将数据循环两次。 不良的编程习惯第 9 位:在中间打破循环 从有一天开始,一个规则制定小组宣布每个循环都应该有一个“不变项”,就是一个在整个循环中都为真的逻辑语句。当不变量不再为真时,循环就结束了。这是处理复杂循环的好方法,但会带来一些令人抓狂的约束,例如禁止我们在循环中间使用 return 或 break。这条规则是禁止 goto 语句规则的子集。 这个理论很不错,但它通常会导致代码变得更复杂。考虑以下这种简单的情况,其中会扫描一个数组,找出通过测试的一个条目: while (i<a.length){ ... if (test(a[i]) then return a[i]; ... } 喜欢循环不变项的人们宁愿我们添加另一个布尔变量,将其称为 notFound,然后这样用它: while ((notFound) && (i<a.length){ ... if (test(a[i])) then notFound=false; ... } 如果这个布尔名称取得很合适,那就会是一段自我注释得很好的代码。它可以让大家理解起来更容易。但这也增加了复杂性。这还意味着要分配另一个局部变量并阻塞一个寄存器,编译器可能没那么聪明,没法修复这个错误。 有时使用 goto 或 jump 会更简洁。 不良的编程习惯第10位:重载运算符和函数 一些有趣的语言会让你绕一些大弯子,比如说重新定义看起来应该是常量的元素值。拿 Python 来说,至少在 2.7 版及更低版本中,它允许你键入 TRUE=FALSE。这不会引发某种逻辑崩溃,也不会导致宇宙的终结;它只是交换了 TRUE 和 FALSE 的含义。你还可以使用 C 预处理器和其他一些语言来玩这种危险的游戏。还有一些语言允许你重新定义加号之类的运算符。 有时候,在一大段代码中重新定义一个或一些所谓常量,结果效率会更高。有时,老板会希望代码执行完全不同的操作。当然,你可以检查代码,逐一更改对应的部分,也可以干脆重新定义现实来节省时间。别人会觉得你是天才。用不着重写庞大的库,只需翻转一下即可。 这里也许应该划一条底线。无论这种做法多有意思,看起来多聪明,你都不应该在家里做实验。这太危险了——我是认真的。

茶什i 2019-12-30 11:01:01 0 浏览量 回答数 0

回答

在以下行中: scanf ("%d",&options); 您实际上输入了一个数字和一个换行符。该scanf功能仅读取数字。它将换行符(\ n)留在输入流中。 调用时getchar(),它将在输入流中找到换行符。因此,它将在不等待用户输入的情况下读取它。如果它在输入流中找不到任何内容,则仅等待用户输入。 一种可能的解决方法是调用getchar 两次而不是一次。第一次调用将读取流中已经存在的换行符。第二个调用在输入流中找不到任何内容。因此,它将按您的期望等待用户输入。 我有一些与您的问题无关的小意见: 您使用scanf ("%f",&*a);。为什么不直接scanf("%f", a);或scanf("%f", &A);? 为什么还要a为变量创建指针A? 我认为您也确实不需要该变量c。 您也不需要i循环中的变量。 您的代码也缺少#include <stdio.h>。我将简化以下内容: #include <stdio.h> #include <stdlib.h> int main() { while (1) { int options = 0, enteredA = 0, enteredB = 0; float A, B; printf ("Calculator\nAvailable options:\n[1]Enter value for A\n[2]Enter value for B\n[3]Addition\n[9]Exit\n"); scanf ("%d", &options); system ("clear"); switch (options) { case 1: printf("Enter a value for A:"); scanf ("%f",&A); enteredA++; break; case 2: printf("Enter a value for B:"); scanf ("%f",&B); enteredB++; break; case 3: if (enteredA ==0 || enteredB == 0) { printf("A and B are not initialized yet. Please enter a value in the menu.\nPress [Enter] to continue to the menu:\n"); fflush(stdin); getchar(); getchar(); } else { printf("%f + %f = %f\n", A, B, A + B); fflush(stdin); getchar(); getchar(); } break; case 9: printf("Calculator Shut Down"); return 0; } system("clear"); } }

几许相思几点泪 2019-12-29 20:29:04 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 SSL证书 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站 2020中国云原生 阿里云云栖号