设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 9000|回复: 24
打印 上一主题 下一主题

[已经解决] if not和unless有什么区别

[复制链接]

Lv3.寻梦者

梦石
0
星屑
1055
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

跳转到指定楼层
1
发表于 2010-7-4 21:17:18 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 DeathKing 于 2010-7-5 02:00 编辑

NetBeans中首选项有这么一项:“将if取反语句变为unless”,我不知道有什么区别,就用Benchmark库做了下面的测试。

希望没有什么语法错误
  1. require 'Benchmark.rb'

  2. TEST_TIMES = 9999999
  3. TEST_STATE = false

  4. Benchmark.bmbm(15) do |t|
  5.         t.report("if not")  {
  6.                 TEST_TIMES.times do
  7.                         if not TEST_STATE
  8.                                 true
  9.                         end
  10.                 end
  11.         }
  12.         t.report("unless") {
  13.                 TEST_TIMES.times do
  14.                         unless TEST_STATE
  15.                                 true
  16.                         end
  17.                 end
  18.         }
  19. end
复制代码
结果是这样的:
  1. Rehearsal --------------------------------------------------
  2. if not           3.954000   0.000000   3.954000 (  4.109375)
  3. unless           3.593000   0.000000   3.593000 (  3.730469)
  4. ----------------------------------------- total: 7.547000sec

  5.                      user     system      total        real
  6. if not           4.219000   0.000000   4.219000 (  4.281250)
  7. unless           3.625000   0.000000   3.625000 (  3.699219)
复制代码
明显unless要快,是因为if not要计算两次么?

See FScript Here:https://github.com/DeathKing/fscript
潜心编写URG3中。
所有对URG3的疑问和勘误或者建议,请移步至发布页面。
欢迎萌妹纸催更

Lv3.寻梦者

梦石
0
星屑
1055
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

2
 楼主| 发表于 2010-7-5 00:37:57 | 显示全部楼层
愚以为4.2和3.6不算区别,更何况这是9999999次重复的累计时间,少量操作根本不是可见的差异
另外评价时间应 ...
darkdrium 发表于 2010-7-5 00:29



复合条件最后也不是要转化为true和false么?
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1055
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

3
 楼主| 发表于 2010-7-5 00:44:50 | 显示全部楼层
回复
优先级应该会影响效率的
比如unless的优先级应该比and和or都低,而if not中not的优先级应该比较高
if ...
darkdrium 发表于 2010-7-5 00:42


我的原意是if not p和unless p啊。
p为复合条件(的真伪值)。


回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1055
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

4
 楼主| 发表于 2010-7-5 00:50:44 | 显示全部楼层
回复
oh,先把p用括号复合了么?
那其实我觉得测试结果如1楼所言,应该是无差异才对的- -数量级太低了。。 ...
darkdrium 发表于 2010-7-5 00:47


我不觉得,有个比较好的点子就是(如果不考虑优先级的问题)

unless p   # (p == false)
  exp
else
  exp
end

而 if 则是 if true而已。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1055
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

5
 楼主| 发表于 2010-7-5 00:59:37 | 显示全部楼层
回复 紫苏 的帖子

的确,i++和++i的区别貌似还是很大。

应该就是这个意思,貌似和“结合能力”扯上关系:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int i = 1,a,b;
  5. a = i++;
  6. b = ++i;
  7. printf("%d %d %d",i,a,b);
  8. }
复制代码
输出 3 1 3

++i 是先自加i然后再复制,i++则相反?

点评

这里如果要用 +=,可以让 i 初始为 -1,然后 a[i+=1]  发表于 2010-7-5 13:02
a=[1,2,3,4,5,6] s=0,i=0 while(true){ s+=a[i++] if i=7 break }  发表于 2010-7-5 11:41
+= 不行么? 或者用next方法。 1.next #=>2  发表于 2010-7-5 01:10
话说js有数组取index的时候就++的,愚以为这个语法相当优雅,可惜ruby不能。。。  发表于 2010-7-5 01:07
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1055
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

6
 楼主| 发表于 2010-7-5 01:03:49 | 显示全部楼层
回复

本来想点评的,结果回复了自己一个空帖子,防止被版主抓到而已灌水,将点评放到这里了。。。

从人 ...
darkdrium 发表于 2010-7-5 00:58


我们英语老师说,unless你别翻译为除非,要翻译为“如果不”。{:nm_3:}

点评

我也觉得,把unless翻成除非到底是哪个人的脑残翻译,除非是除了不是的意思,除了不是那就是是了,就相当于如果,unless应该翻成不能省去以下条件。  发表于 2010-7-5 09:51
善!就是这么说!我每次都脑补的  发表于 2010-7-5 01:06
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1055
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

7
 楼主| 发表于 2010-7-5 01:14:31 | 显示全部楼层
回复

呵呵,对的,不过我说的是效率,i++ 要额外使用一个寄存器保存 i 的值作为返回值,然后再把 i 加 1 ...
紫苏 发表于 2010-7-5 01:12


效率这种事应该要交给解释器或者编译器来优化,然后自己再在解释器或者编译器那里效率完美主义。

觉得NOI除了搞算法剩下的也只有效率完美主义了。

点评

学校没组织,只是看了几本教材而已。再说咱对Pascal无爱,C入门,II参加过。  发表于 2010-7-5 11:31
NOI?orz……DeathKing君是参加NOI的大牛?  发表于 2010-7-5 08:34
其实我们在这讨论的都属于小细节,无伤大雅,但有时确实不能完全相信编译器——一个经典的例子:大部分 C/C++ 编译器都没有尾部递归优化,所以在 C/C++ 中递归效率不如循环   发表于 2010-7-5 02:13
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-5-8 07:50

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表