由一些小問題引發(fā)的思考

如何判斷數(shù)組是否為空?

  • c++實(shí)現(xiàn)
 //stl容器里面可以利用empty, count等方法去判斷是否含有元素
 std::vector<int> iVec;
 if(iVec.count() <= 0 || iVec.empty()){
  // 空容器
 }
    
 // 基本的內(nèi)置類型數(shù)組 可以結(jié)合sizeof來判斷。當(dāng)然如果是數(shù)組的話,就不應(yīng)該為空,int a[0]編譯器會報(bào)錯。
 // 如果我們想判斷數(shù)組內(nèi)元素?cái)?shù)量,可以如下判斷。
 int nArray[10];
 memset(nArray, 0);
 int nCount = sizeof(nArray) / sizeof(int[0]);

  • php實(shí)現(xiàn)
 //由于php數(shù)組是動態(tài)的,數(shù)組可以是空的
 $array = array();
 if(count($array) <=0 || sizeof($array) <= 0){
  //空:sizeof 和 count是等價(jià)的 別名關(guān)系
 }
 if(empty($array)){
  //空:
 }

關(guān)于PHP的empty函數(shù)php-manual中這樣解釋:
一下情況empty均返回 true

  • "" (空字符串)
  • 0 (作為整數(shù)的0)
  • 0.0 (作為浮點(diǎn)數(shù)的0)
  • "0" (作為字符串的0)
  • NULL
  • FALSE
  • array() (一個空數(shù)組)
  • $var; (一個聲明了,但是沒有值的變量)

php 不同類型的變量之間的比較

$x = "xxyy";
$y = 0;
var_dump(max($x , $y));     // $x

$a = 'a';
$b = 'b';
var_dump(max($a , $b) );    // $b

$arr = [1];
$num = 100;
var_dump(max($arr , $num)); // $arr

查閱了PHP Manual 得到如下反饋:
http://www.php.net/manual/zh/language.operators.comparison.php
多種類型比較時的結(jié)果。
Warning
由于浮點(diǎn)數(shù) float 的內(nèi)部表達(dá)方式,不應(yīng)比較兩個浮點(diǎn)數(shù)float是否相等。


0作為除數(shù)會怎樣?

echo "如果除數(shù)是0會怎么樣?";

$num1 = 10;
$num2 = 0;
$num  = $num1/$num2; 
var_dump($num);

這時候程序運(yùn)行的時候會產(chǎn)生一條警告:

如果除數(shù)是0會怎么樣?
Warning: Division by zero in D:\temp\helloworld.php on line 18
float(INF)

所以我們?nèi)绻竺嫒匀恍枰褂?num去參與運(yùn)算的話,后面的結(jié)果肯定是無法預(yù)料的。為了保證程序運(yùn)行期間的穩(wěn)定性,我們需要除法之前判斷除數(shù)是否為0使用異常處理

曾天真地以為'使用異常處理'能捕獲到除數(shù)為0這樣的異常,然而并不是:

# 剛開始以為這樣會在$num2==0的時候拋出一個異常,然而并沒有。接下來我開始懷疑是不是因?yàn)镻HP這種語言無法捕獲到'0作為除數(shù)'這種異常?C++一定行!
try{
    $num  = $num1/$num2;
}
catch(Exception $e){
    echo $e->getMessage();
}
# 于是我試了試C++:
int dev = 0;
int num = 10;

try{
    std::cout << "result:" << num / dev << std::endl;
}
catch(...){
    std::cout << "found exception:" << GetLastError() << std::endl;
}

看到結(jié)果的時候我為自己盲目地'自信'感覺到好笑:C++也并沒有拋出異常,報(bào)了一個運(yùn)行期間的錯誤:

Curiosity.exe 中的 0x0104104a 處有未經(jīng)處理的異常: 0xC0000094: Integer division by zero

所以,這是為什么呢?最后得到的答案是這樣的:
http://stackoverflow.com/questions/10460957/why-cant-catch-exception-in-a-constructor

An Integer divided by zero is not an standard C++ exception. So You just cannot rely on an exception being thrown implicitly.
Best you can do is to check the error condition(divisor equals zero) yourself and throw an exception explicitly.

所以最后對代碼做了這樣的修改,其實(shí)和手動判斷已經(jīng)沒有太大的區(qū)別了。

$num1 = 10;
$num2 = 0;

try{
    if(intval($num2) == 0){
        throw new Exception("0 作為除數(shù)");
    }
    $num  = $num1/$num2;
}
catch(Exception $e){
    echo $e->getMessage();
}

另外,如果不加判斷的話遇到除數(shù)是0的表達(dá)式會返回一個INF值,INF means infinity 程序并不會報(bào)錯。


array_merge的小陷阱:

$ar_empty = [];
$ar_null  = null;
$array = [1,2,3];

var_export(array_merge($array, $ar_empty)); // 結(jié)果為$array的內(nèi)容
var_export(array_merge($array, $ar_null)); // 警告 結(jié)果為NULL

php 5.0 以后array_merge中僅支持?jǐn)?shù)組作為參數(shù)。 那如果傳入NULL的話,不管其他元素是不是NULL,結(jié)果都會是NULL。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,693評論 19 139
  • 1.在C/C++中實(shí)現(xiàn)本地方法 生成C/C++頭文件之后,你就需要寫頭文件對應(yīng)的本地方法。注意:所有的本地方法的第...
    JayQiu閱讀 2,539評論 0 3
  • Lua 5.1 參考手冊 by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 14,259評論 0 38
  • Jni數(shù)據(jù)類型 Jni方法 來自 http://blog.chinaunix.net/uid-22028680-i...
    FlyDragonInSky閱讀 1,008評論 0 0
  • 我對教育的理解是這樣的:在孩子小的時候,給ta提供一個安全的環(huán)境,包括,身體和情緒的安全;一個能自由探索的空間。在...
    加西閱讀 565評論 1 2

友情鏈接更多精彩內(nèi)容