C++里if 和while和if嵌套

51CTO旗下网站
Scala中的if表达式和while循环
本文节选自Martin Odersky,Lex Spoon和Bill Venners所著,Regular翻译的《Programming in Scala》的第七章。Scala是一种针对 JVM 将函数和面向对象技术组合在一起的编程语言。
作者:Martin Odersky等来源:Artima| 14:03
Scala的if如同许多其它语言中的一样工作。它测试一个状态并据其是否为真,执行两个分支中的一个。下面是一个常见的例子,以指令式风格编写:
51CTO编辑推荐:
var&filename&=&"default.txt"&if&(!args.isEmpty) &&filename&=&args(0) &这段代码声明了一个变量,filename,并初始化为缺省值。然后使用if表达式检查是否提供给程序了任何参数。如果是,就把变量改成定义在参数列表中的值。如果没有参数,就任由变量设定为缺省值。
这段代码可以写得更好一点,因为就像第2章第三步提到过的,Scala的if是能返回值的表达式。代码7.1展示了如何不使用任何var而实现前面一个例子同样的效果:
val&filename&= &&if&(!args.isEmpty)&args(0) &&else&"default.txt"&
代码 7.1&在Scala里根据条件做初始化的惯例
这一次,if有了两个分支。如果args不为空,那么初始化元素,args(0),被选中。否则,缺省值被选中。这个if表达式产生了被选中的值,然后filename变量被初始化为这个值。这段代码更短一点儿,不过它的实际优点在于使用了val而不是var。使用val是函数式的风格,并能以差不多与Java的final变量同样的方式帮到你。它让代码的读者确信这个变量将永不改变,节省了他们扫描变量字段的所有代码以检查它是否改变的工作。
使用val而不是var的第二点好处是他能更好地支持等效推论:equational reasoning。在表达式没有副作用的前提下,引入的变量等效于计算它的表达式。因此,无论何时都可以用表达式替代变量名。如,要替代println(filename),你可以这么写:
println(if&(!args.isEmpty)&args(0)&else&"default.txt")&
选择权在你。怎么写都行。使用val可以帮你安全地执行这类重构以不断革新你的代码。
尽可能寻找使用val的机会。它们能让你的代码既容易阅读又容易重构。
Scala的while循环表现的和在其它语言中一样。包括一个状态和循环体,只要状态为真,循环体就一遍遍被执行。代码7.2展示了一个例子:def&gcdLoop(x:&Long,&y:&Long):&Long&=&{ &&var&a&=&x &&var&b&=&y &&while&(a&!=&0)&{ &&&val&temp&=&a &&&a&=&b&%&a &&&b&=&temp &&} &&b &}&
代码 7.2&用while循环计算最大公约数
Scala也有do-while循环。除了把状态测试从前面移到后面之外,与while循环没有区别。代码7.3展示了使用do-while反馈从标准输入读入的行记录直到读入空行为止的Scala脚本:
var&line&=&""&do&{ &&line&=&readLine() &&println("Read:&"&+&line) &}&while&(line&!=&null) &
代码 7.3&用do-while从标准输入读取信息
while和do-while结构被称为“循环”,不是表达式,因为它们不产生有意义的结果,结果的类型是Unit。说明产生的值(并且实际上是唯一的值)的类型为Unit。被称为unit value,写做()。()的存在是Scala的Unit不同于Java的void的地方。请在解释器里尝试下列代码:
scala&&def&greet()&{&println("hi")&} &greet:&()Unit &scala&&greet()&==&() &hi &res0:&Boolean&=&true&
由于方法体之前没有等号,greet被定义为结果类型为Unit的过程。因此,greet返回unit值,()。这被下一行确证:比较greet的结果和unit值,(),的相等性,产生true。
另一个产生unit值的与此相关的架构,是对var的再赋值。比如,假设尝试用下面的从Java(或者C或C++)里的while循环成例在Scala里读取一行记录,你就遇到麻烦了:
var&line&=&""&while&((line&=&readLine())&!=&"")&&&println("Read:&"+&line) &
编译这段代码时,Scala会警告你使用!=比较类型为Unit和String的值将永远产生true。而在Java里,赋值语句可以返回被赋予的那个值,同样情况下标准输入返回的一条记录在Scala的赋值语句中永远产生unit值,()。因此,赋值语句“line = readLine()”的值将永远是()而不是""。结果,这个while循环的状态将永远不会是假,于是循环将因此永远不会结束。
由于while循环不产生值,它它经常被纯函数式语言所舍弃。这种语言只有表达式,没有循环。虽然如此,Scala仍然包含了while循环,因为有些时候指令式的解决方案更可读,尤其是对那些以指令式背景为主导的程序员来说。例如,如果你想做一段重复某进程直到某些状态改变的算法代码,while循环可以直接地表达而函数式的替代者,大概要用递归实现,或许对某些代码的读者来说就不是那么显而易见的了。
如,代码7.4展示了计算两个数的最大公约数的替代方式。 给定同样的值x和y,代码7.4展示的gcd函数将返回与代码7.2中gcdLoop函数同样的结果。这两种方式的不同在于gcdLoop写成了指令式风格,使用了var和while循环,而gcd更函数式风格,采用了递归(gcd调用自身)并且不需要var:
def&gcd(x:&Long,&y:&Long):&Long&= &&if&(y&==&0)&x&else&gcd(y,&x&%&y) &
代码 7.4&使用递归计算最大公约数
通常意义上,我们建议你如质疑var那样质疑你代码中的while循环。实际上,while循环和var经常是结对出现的。因为while循环不产生值,为了让你的程序有任何改变,while循环通常不是更新var就是执行I/O。可以在之前的gcdLoop例子里看到。在while循环工作的时候,更新了a和b两个var。因此,我们建议你在代码中对while循环抱有更怀疑的态度。如果没有对特定的while或do循环较好的决断,请尝试找到不用它们也能做同样事情的方式。
【相关阅读】
【责任编辑: TEL:(010)】
大家都在看猜你喜欢
头条头条头条头条头条
24H热文一周话题本月最赞
讲师:161447人学习过
讲师:146173人学习过
讲师:13038人学习过
精选博文论坛热帖下载排行
本书是一本优秀的C++教材,内容包括:基础类型、操作符和简单变量,循环和决策,命名空间和C++标准库,用C++编写函数,行为、序列点和求值...
订阅51CTO邮刊1979人阅读
C/C++基础知识(21)
(1)if语句:
1)bool类型的判断:if(flag)/if(!flag);
整数类型的判断:if(value==0)/if(value!=0)/if(value&=0);
浮点数类型的判断:if(x&=0)/if(x&0),不应该讲”!=”/”==”用作浮点数的比较;
指针变量的判断:if(p==NULL)/if(p!=NULL)
2)写程序的时候要特别注意:if条件表达式中的变量在其语句块中的改变,例如:
//这时a的值已经改变了,就会影响接
下来一条语句
3)io类型可以用作if条件表达式,但是string类型和容器类型不能用于if条件表达式。
(2)switch语句:
1)switch中的表达式必须是一个整型表达式,{}后面不加分号;
2)case标号的值是一个常量表达式;
3)如果表达式与其中一个标号匹配,则程序将从该标号开始依次执行各个语句直到遇到break语句或者switch结束;
4)一个标号不能独立存在,必须位于语句之前,所以如果switch语句以default标号结束且不需要完成任何任务,那么该标号后面必须有一个空语句;
5)switch语句中两个标号不能具有相同的值,否则会发生编译错误;
6)switch结构只能在它最后一个标号后面定义变量,如果需要为特殊的case标号定义变量,必须在语句块中定义;
7)default关键词一般放在switch语句的最后面,但是也有可能放在case语句之前。
当default关键词放在最后的时候,如果没有case与条件匹配,则会执行default
中的表达式,如果有case与条件匹配,但是没有break中止的情况下,也会执行
default表达式。当default关键字放在中间的时候,编译器先验证所有case是否与条件符合,如果有与条件符合的情况下,则按照正常顺序执行下去,如果没有与case相符合的话,就执行default语句以及其后面的语句,直到遇到break或者结尾终止。
(3)while语句:
1)while语句与do while语句执行次序不一样,do while语句第一次肯定执行;
2)与while语句不同,do while语句总是以分号结束;
(4)for语句:
1)for语句的三个部分必须以分号隔开,缺省情况下也需要加上分号;
2)for语句由初始化语句、循环条件语句、表达式语句组成,初始化语句可以定义多个对象,但是每个对象必须具有相同的类型;C++里if 和while_百度知道
C++里if 和while
C++里if 和while这道题里为什么一定要把if a,b=0放在里面,而不能把这个条件放在另一个if条件上面,为什么那样没有返回值
我有更好的答案
那么当a和b都为0时直接跳出循环,还会执行下面的判断吗。程序要做的是当-1≤a≤1且-1≤b≤1时输出yes,然后判断a和b是否同时为0,是则结束循环。如果你把if(a==0&&b==0) break放到最前面仔细思考程序逻辑
那当a,b不都等于0时呢?程序为什么不继续执行呢
如果-1≤a≤1且-1≤b≤1,当然会进入if输出yes。
不呀,我输入1 0,程序没有返回值,并且程序会立即结束,不会参与循环
你把程序改成什么样了?
我就是把if
a,b等于0放在前面了呀
那不可能没有输出。把你改后的程序发上来。
第一个if内的语句没有用大括号括起来。if(a==0&&b==0){&&&&cout&&&yes&&&&&&&}
那这样写应该和前面那种等价吧
采纳率:75%
来自团队:
为您推荐:
您可能关注的内容
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)while 的区别是什么?解决思路 - C++当前位置:& &&&if 和
while 的区别是什么?解决思路if 和
while 的区别是什么?解决思路www.MyException.Cn&&网友分享于:&&浏览:12次if 和
while 的区别是什么??我写了个程序其中有一个交换数列的地方??
& #include &
&iostream&
using & namespace &
int & main()
int & a[10001];
int & t,k,d,f,n,i=0,g;
& cin & & &
for( & k=0;k &t;k++)
& for( & d=1;d &=n;d++)
& cin & & &
& for(f=1;f &=n;f++ & ) &
if(a[f]!=f) &
& ///就是这个地方的if & 和while &
& g & = & a[f];
& a[f] & = & a[g];
& a[g] & = & &
return & 0;
如果用if & 会的到一个答案 &
& 但是用while & 又会的到一个答案。 & 这是为什么??
& 那个大个帮帮忙哦??
------解决方案--------------------·····
if 进行一次逻辑判断,根据判断逻辑结果决定是否操作;
while 进行一系列循环操作,可能执行 N 次 ...
------解决方案--------------------在这里if同while是没有区别的。完全可以替换。但是问题出在你的程序上。
int t,k,d,f,n,i=0,g;
for( k=0;k &t;k++)
for( d=1;d &=n;d++)
你在cin分别是什么意思?!!!
放的位置你认为妥当么?
你是不是想 a[d]=d; ???
------解决方案--------------------n=5;
if (n &10)
你觉得输出是什么?还是没有输出?最后n的值是多少,5还是6?
while (n &10)
同样的问题,现在输出是什么?n又是多少呢?
------解决方案--------------------; 7
mov DWORD PTR _n$[ebp], 5
cmp DWORD PTR _n$[ebp], 10
; 0000000aH
jge SHORT $L339
printf( &hello\n &);
push OFFSET FLAT:??_C@_06KIKN@hello?6?$AA@ ; `string '
call _printf
add esp, 4
mov eax, DWORD PTR _n$[ebp]
add eax, 1
mov DWORD PTR _n$[ebp], eax
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有

我要回帖

更多关于 c语言while和if 的文章

 

随机推荐