手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表Tag:sqlserver

转:php变量连接函数短路操作($f) && f(),$condition && function()用法意思解释说明

其实我是真想自己写这一段内容的,只是后来找了找手册,居然不知道在哪一章了。
短路操作符,很容易让人误解是if条件中的 && 或者 ||,但实在不知道从何说起(至于是不是叫短路操作符,我也记不清了,先这么命名吧)
其实这个玩意大家都见过,只是大家都忽略了。想起很久很久以前,所有的参考书上有一段连接数据库的代码:
$conn = mysql_connect(localhost,root,123456) or die('could not connect db');
这段代码,就是一个很简单的例子。
如果能够连接上,就返回$conn,否则直接输出。。。。无非就是将||换成了 or,于是很多人就不认识了罢了。
然后,国内用的最多的这种代码的是某一个论坛,在他们的代码里大量充斥了这种操作符,很多人在第一次看他们的源码时都会比较郁闷。。。这个论坛叫phpwind。
好了,我不多说了,上原文吧:http://feihu.cd00.cn/itweb/index.php/php-duanlu-condition-function

什么是php短路操作,先看下面代码
($f) && f(); 或者
$condition && function();
这是什么用法
短路操作,什么意思呢

如果$f为真,就执行f()函数调用
如果$condition为真,就执行function()函数调用
if ($f) {
    f();
}

另找了篇文章来详细说明之
mysql_query($sql) or die(’Execute failed!’);
!file_exists($cache_file) && @update_cache($id);

这两句很像是条件语句,但是准确的说,他们是利用了短路运算符的运算特点来实现的条件语句:
or、||、and、&& 都是短路运算符
&&(and)运算符检查第一个表达式是否返回“flase”,如果是“false”则结束语句并返回“false”,否则检查第二个表达式。
or(||)运算符检查第一个表达式是否返回“true”,如果是“true”则结束语句并返回“true”,否则检查第二个表达式。
该用法正是利用了短路运算符这种特性实现了条件的判断和执行

----------
再看这一篇:http://biancheng.dnbcw.info/perl/241992.html

  和C类似,Perl提供 &&(逻辑 AND)和 ||(逻辑 OR)操作符。它们从左向右计算( && 比 || 的优先级稍稍高一点点),测试语句的真假。这些操作符被认为是短路操作符,因为它们是通过计算尽可能少的操作数来判断语句的真假。例如,如果一个 && 操作符的左操作数是假,那么它永远不会计算右操作数,因为操作符的结果就是假,不管右操作数的值是什么。

例子 名称 结果
$a && $b And 如果$a为假则为$a,否则$b
$a || $b Or 如果$a为真则为$a,否则$b

这样的短路不仅节约时间,而且还常常用于控制计算的流向。比如,一个经常出现的Perl程序的俗语是:

open(FILE, "somefile") || die "Can't open somefile: $!\n";

在这个例子里,Perl 首先计算 open 函数,如果值是真(somefile 被成功打开),die 函数的执行就不必要了,因此忽略。你可以这么读这句文本“打开文件,要不然就去死!”。

&& 和 || 操作符和 C 不同的是,它们不返回 0 或 1,而是返回最后计算的值。如果是 ||,这个特性好就好在你可以从一系列标量数值中选出第一个为真的值。所以,一个移植性相当好的寻找用户的家目录的方法可能是:

$home = $ENV{HOME}
|| $ENV{LOGDIR}
|| (getpwuid($<)) [7]
|| die "You're homeless!\n";

另一方面,因为左参数总是在标量环境里计算,所以你不能把 || 用于在两个集群之间选择其一进行赋值:

@a = @b || @c;      # 这样可不对
@a = scalar(@b) || @c; # 上面那句实际上是这个意思,@a 里只有 @b 最后的元素
@a = @b ? @b : @c; # 这个是对的

Perl 还提供优先级比较低的 and 和 or 操作符,这样程序的可读性更好而且不会强迫你在列表操作符上使用圆括弧。它们也是短路的。

Tags: 短路操作

微软的虚拟桌面:Desktops

微软在几年前为自己的PowerToys组件里添加了一个virtual desktop manager( MSVDM ),使得XP用户及XP以前版本的用户体验到了多个虚拟桌面的感觉,然而在最新OS里面,MSVDM并不为他们提供支持。所以想使用MSVDM的朋友,只能使用XP或以前版本了(虽然2000也不错,但现在不会使用它。。。)

或许是听到了群众的呼声吧,在今年8月份,微软又推出了一款小软件:desktops,终于可以象在linux下一样使用虚拟桌面了。这是一款缺点和优点同样明显的软件:
优点是:

  1. 文件很小,而且绿色
  2. 支持启动的时候加载
  3. 快捷键虽然固定,但相对比较灵活

缺点是:

  1. 只能设四个虚拟桌面,不能是三个或者2个
  2. 每个虚拟桌面都是一个独立的explorer进程,内存小的朋友尽量不要尝试
  3. 虚拟桌面出错的时候,由于独立进程explorer并没有关闭,所以你打开的软件,是找不到的。非得再运行一下这款软件

Desktops介绍和下载页:
下载页为:http://technet.microsoft.com/en-us/sysinternals/cc817881.aspx

Introduction

Desktops allows you to organize your applications on up to four virtual desktops. Read email on one, browse the web on the second, and do work in your productivity software on the third, without the clutter of the windows you’re not using. After you configure hotkeys for switching desktops, you can create and switch desktops either by clicking on the tray icon to open a desktop preview and switching window, or by using the hotkeys.

Using Desktops

Unlike other virtual desktop utilities that implement their desktops by showing the windows that are active on a desktop and hiding the rest, Sysinternals Desktops uses a Windows desktop object for each desktop. Application windows are bound to a desktop object when they are created, so Windows maintains the connection between windows and desktops and knows which ones to show when you switch a desktop. That making Sysinternals Desktops very lightweight and free from bugs that the other approach is prone to where their view of active windows becomes inconsistent with the visible windows.

Desktops reliance on Windows desktop objects means that it cannot provide some of the functionality of other virtual desktop utilities, however. For example, Windows doesn't provide a way to move a window from one desktop object to another, and because a separate Explorer process must run on each desktop to provide a taskbar and start menu, most tray applications are only visible on the first desktop. Further, there is no way to delete a desktop object, so Desktops does not provide a way to close a desktop, because that would result in orphaned windows and processes. The recommended way to exit Desktops is therefore to logoff.

对于微软的PowerToys,可以到这里看看:
http://www.microsoft.com/windowsxp/downloads/powertoys/xppowertoys.mspx
你会在这里发现一些很有用的软件。当然,MSVDM也在里面,下载在右侧,黑黑

Tags: 微软, microsoft, vdm, desktops

惊心动魄的SQL BUG

刚才打开google reader的时候,突然看到一篇文章,让俺大吃一惊呀。详细内容如下:

原文网址:http://www.cnblogs.com/xinerzhui/archive/2008/07/30/1256648.html
  1.  请谨慎注意这一微软SQLBug  
  2. 刚来博客园,有什么不对,需要改进的地方,欢迎各位同道指出来,谢谢。  
  3. 今天在使用数据库时出现意外操作,将一张表的数据删除了。仔细查看SQL语句,发现问题。将问题类推到Northwind中。我们使用两个表,Employees和Products  
  4. SQL语句如下:  
  5. select * from Products where CategoryID in (select CategoryID from Employees)  
  6. 不看表结构是看不出什么问题的,不清楚的看一下表结构。执行上面的SQL语句,你将能看到所有的产品记录。  
  7. 当你执行上面语句的"select CategoryID from Employees",将会提示一个错误提示:  
  8. 消息 207,级别 16,状态 3,第 1 行  
  9. 列名 'CategoryID' 无效。  
  10. 表Employees中根本就没有CategoryID列,而微软忽略了括号中的错误,执行前面的语句。如果是应用在删除,更新,那后果将是不可现象的。我曾为此付出了代价。  
  11. 这个应该就是微软SQL的BUG吧,我们需要特别注意。  
  12. 在SQL2000企业管理器,SQL2000的查询分析器,SQL2005的Management Studio Express中均有此Bug。   

 

然后有人回复为:

#2楼 2008-07-30 17:21 | 熊呜呜
我在Sql2000上测试,确实有这个问题。  

#3楼 2008-07-30 17:27 | ocean  
  1. 有意思的问题,在我的management studio里面查询,也会有这个问题,要好好地研究一下。  

#7楼 117.22.68.*2008-07-30 17:45 | johnnyshieh [未注册用户]
  1. Microsoft SQL Server Management Studio 9.00.1399.00  
  2. 有楼主说的问题!  
  3. 确实应该注意一下。  
#9楼 2008-07-30 17:55 | 金色海洋(jyk)
  1. 看了表结构才知道,Employees 表里面没有 CategoryID字段。为什么不报错呢。错误被吃掉了。  
  2.   
  3. select * from Products where CategoryID in (select CategoryID from Employees)  
  4.   
  5. select * from Products where CategoryID in (select EmployeeID from Employees)  
  6.   
  7. 我比较了一下这两个语句的执行计划,不完全一样。建议lz分析一下执行计划。  
  8. 因为我还不能完全看懂执行计划。只能看出来两个执行计划是不一样的。呵呵。  
在MYSQL里没有试会不会遇到这种情况,我用navicat试是没有这种情况的。不知道其他的会不会有。

联想起以前写CRUD之类的东西时候,在过滤条件时,自动将空值直接unset掉,然后再拼成SQL,后来被BOBBY严厉批评了一下,确实,查询的时候感觉不出有什么问题,可如果是在UPDATE或者是DELETE的时候呢?本来是有条件的,可突然被unset掉成为没有条件了,那岂不是很恐怖?

借这个机会再次提醒自己,细心、周全、小心

 

Tags: mssql, sqlserver, microsoft, sql, bug

Records:812