当前位置:  开发笔记 > 编程语言 > 正文

你更喜欢"if(var)"还是"if(var!= 0)"?

如何解决《你更喜欢"if(var)"还是"if(var!=0)"?》经验,为你挑选了7个好方法。

我已经用C语言编程了几十年了.在某个地方,我决定不再想写:

if (var)    // in C
if ($var)   # in Perl

当我的意思是:

if (var != 0)
if (defined $var and $var ne '')

我认为部分原因是我有一个强类型的大脑,在我看来,"if"需要一个布尔表达式.

或者也许是因为我使用Perl这么多,Perl中的真相和虚假就是这样一个雷区.

或者也许只是因为这些天,我主要是一名Java程序员.

你有什么偏好?为什么?



1> shoosh..:

if大声朗读时喜欢我的意思:

if (is_it_happening) ...
if (number_of_sheep != 0) ...
if (pointer_to_something != NULL) ...


对于一个绝地大师,好吧,特别是.
左边的常数打败了能够大声读出来的目的.
当编译器出现脑震荡时,LHS上的常量是有意义的.现在,如果您尝试在if中进行分配,则会发出警告,并且每个人都应该打开"将警告视为错误".
请在LHS上使用常量:)
@Shy 0!= number_of_sheep(零不是绵羊的数量)对我来说听起来不错:P

2> asalamon74..:

我更喜欢

if (var != 0)

它更容易阅读/理解.由于您只编写了一次代码但是阅读了很多次,因此轻松阅读比简单编写更重要.



3> Schwern..:

这很简单. if( var )测试真实性. if( var != 0 )测试它不是数字0.它们 不是可交换的! 有三个原因.

首先,if( var != 0 )用来检验真相更复杂.还有更多东西可供阅读和理解.你必须克服这个!=并且0是"是真的"的成语.由于缺乏独特的视觉模式,你必须多做一点研究才能知道它与它不一样if( var == 0).这是一个很薄的区别,但值得一提.if( 0 != var )风格存在的事实让人信服.最好只是消除问题并if( var )用于真实性.

其次,更重要的是,意图必须明确.您是在测试真相还是在测试一些(或缺少)? if( var )正在测试真相,if( var != 0 )正在测试一个数字.要确定任何其他内容,需要了解作者的风格,我们必须假设维护程序员没有.

第三,这里假设真假和数字运算符的值可能在某些语言中有效,而在其他语言中则不然.在Perl中,我认为Javascript也是空字符串是假的.很多运算符返回空字符串为false.所以测试真相if( var != 0 )会导致警告.当你做一些更天真的事情时,它变得更加明显,就像if( var == 1 )真理一样,这是一个明显危险的假设.我似乎有很多初级程序员写这个,然后编写函数返回奇数但真实的数字来惩罚这类事情.或者当我心情愉快的时候,我已经清理了我的回报价值return var ? 1 : 0.

在相关的说明中,Perl将从子例程返回最后一个计算的表达式,因此没有必要实际写入return.将此与人们认为明显return较慢的想法相结合,你会让很多人滥用这个事实.

sub set {
    my( $self, $key, $value ) = @_;

    $self->{$key} = $value;
}

set会回来的$value.这是有意的吗?我不知道.我所知道的是有人会开始依赖它.维护程序员不知道他们是否可以改变它.所以我喜欢在每个非平凡的子程序中明确地返回一个.

sub set {
    my( $self, $key, $value ) = @_;

    $self->{$key} = $value;
    return;
}

在那种情况下,我决定set暂时不返回任何内容,这个决定对读者和用户都很清楚.



4> gak..:
if (var)

少打字,只要你确定你没有测试错误的东西.


@PolyThinker,这不是真的.

5> paxdiablo..:

我更喜欢显式测试,除非括号内的结果是显式布尔值.短语"if(1)"虽然在语法上在语法和语义上是正确的,但却不符合逻辑.它应该是真或假,不是自动投射.

我喜欢可读的逻辑代码,以减少任何一天的输入.

我也鄙视形式的强烈代码:

if (gotError == FALSE) ...
if (isComplete == TRUE) ...

如果布尔值被正确命名(并且它应该是),那么正确的方法是:

if (!gotError) ...
if (isComplete) ...

那是因为(使用reductio ad absurdum)boolVal == TRUE只是另一个布尔值,所以你在哪里停止?

if (isComplete == TRUE) ...
if ((isComplete == TRUE) == TRUE) ...
if (((isComplete == TRUE) == TRUE) == TRUE) ...
if ((((isComplete == TRUE) == TRUE) == TRUE) == TRUE)...

等等,无限的.



6> Guvante..:

我会说如果你比较一个真正的整数,那么永远不要隐式转换为布尔值,因为它暗示了变量的不同含义.

但是那种风格如此受欢迎可能并不是一件大事,但是从我与C#的合作中,我用这种风格编写了我的C++代码:

布尔或int基本上是布尔值:

if (val)

超过true/false的真正整数很重要:

if (val != 0)

某种指针:

if (val != NULL)

但是,正如许多人会说的那样,编码样式没有任何功能差异,最好是保持一致,如果你正在使用现有的代码,那就要与代码保持一致.



7> mirod..:

在Perl if (defined $var and $var ne '')if( $var)不相等.尝试一下$var=0.相反,如果您测试$var!=0所有无法转换为数字的字符串将无法通过测试(如果您打开它们会发出警告).

因此,您必须确切知道您的变量包含的内容(数字或字符串,是否可以undef),以便您可以进行相应的测试.

我通常只是写if( $var),让Perl照顾它.我相信这更容易阅读,这是Perl中最常见的风格.

通常,实际上,正确的测试最终会成为if( defined $var).这就是perl的新(5.10)//运算符派上用场的地方.$var= $val // $default或经常$var //= $default,只有(resp )$var才会收到.$default$val$varundef

推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有