如何判斷數(shù)組是否為空?
- c++實(shí)現(xiàn)
//stl容器里面可以利用empty跟压, count等方法去判斷是否含有元素
std::vector<int> iVec;
if(iVec.count() <= 0 || iVec.empty()){
// 空容器
}
// 基本的內(nèi)置類型數(shù)組 可以結(jié)合sizeof來(lái)判斷。當(dāng)然如果是數(shù)組的話测砂,就不應(yīng)該為空即供,int a[0]編譯器會(huì)報(bào)錯(cuò)感局。
// 如果我們想判斷數(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ù)組是動(dòng)態(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() (一個(gè)空數(shù)組)
- $var; (一個(gè)聲明了,但是沒有值的變量)
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
多種類型比較時(shí)的結(jié)果统屈。
Warning
由于浮點(diǎn)數(shù) float 的內(nèi)部表達(dá)方式胚吁,不應(yīng)比較
兩個(gè)浮點(diǎn)數(shù)float是否相等。
0作為除數(shù)會(huì)怎樣愁憔?
echo "如果除數(shù)是0會(huì)怎么樣?";
$num1 = 10;
$num2 = 0;
$num = $num1/$num2;
var_dump($num);
這時(shí)候程序運(yùn)行的時(shí)候會(huì)產(chǎn)生一條警告:
如果除數(shù)是0會(huì)怎么樣?
Warning: Division by zero in D:\temp\helloworld.php on line 18
float(INF)
所以我們?nèi)绻竺嫒匀恍枰褂?num去參與運(yùn)算的話腕扶,后面的結(jié)果肯定是無(wú)法預(yù)料的。為了保證程序運(yùn)行期間的穩(wěn)定性吨掌,我們需要除法之前判斷除數(shù)是否為0
或 使用異常處理
:
曾天真地以為'使用異常處理'能捕獲到除數(shù)為0
這樣的異常半抱,然而并不是:
# 剛開始以為這樣會(huì)在$num2==0的時(shí)候拋出一個(gè)異常,然而并沒有膜宋。接下來(lái)我開始懷疑是不是因?yàn)镻HP這種語(yǔ)言無(wú)法捕獲到'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é)果的時(shí)候我為自己盲目地'自信'感覺到好笑:C++也并沒有拋出異常秋茫,報(bào)了一個(gè)運(yùn)行期間的錯(cuò)誤:
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.
所以最后對(duì)代碼做了這樣的修改肛著,其實(shí)和手動(dòng)判斷已經(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á)式會(huì)返回一個(gè)INF值枢贿,INF means infinity 程序并不會(huì)報(bào)錯(cuò)殉农。
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é)果都會(huì)是NULL。