php
字串和數字比較一些問題
,因為數字與字元在
php中是不同的資料型別,所以在比較時可能會有很多的問題。
今天遇到乙個問題,呼叫對方介面,按照介面說明,返回為數字0,
1,2等等,其中
0標示成功,其他表示不同的錯誤**。程式通過
if ($ret == 0)
進行判斷,開始程式是好的,今天出現問題了,由於對方介面修改,直接返回字母字串作為錯誤資訊提示,然後我這邊就悲劇了,上述判斷永遠都為
true
。原因在於
php是弱型別語言,所以可以對兩個不同型別的變數進行比較操作,但最終進行比較前,
php會把某一方轉換稱另一方一樣的型別,這點很重要。如果是字串和數字進行比較,那麼
php會把字串強制轉換稱數字,對於純字母的字串,那麼轉換後就是
0了,所以
if ($ret == 0)
成了。php手冊/
語言參考
/運算子
/比較運算子
可以找到. 在
php裡當兩個數字型字串
(只含數字的字串
)進行比較的時候是直接轉換成數值進行比較的
如下示例
:(注意$a和
$b兩個變數的最後一位不相等
) **如下
複製**
//示例1
<?php
$a = '511203199106034578';
$b = '511203199106034579';
if ($a==$b) else
?>
執行上面的程式卻發現結果為
equal(
非我們認為的結果
) 我們把$a與
$b分別加乙個字母a進去
**如下
複製**
//示例2
<?php
$a = 'a511203199106034578';
$b = 'a511203199106034579';
if ($a==$b) else
?>
這次輸出的是
notequal(
正確的結果
) 示例1為
equal
是因為php
把兩個數字型字串轉換成數字型
,而這兩個數字剛好相等如下示例
**如下
複製**
<?php
$a = 511203199106034578;
$b = 511203199106034579;
echo $a; // 輸出 5.1120319910603e+17 即511203199106030000
echo $b; // 輸出 5.1120319910603e+17 即511203199106030000
?>
所以我們在示例
1中得到的結果是
equal
避免出現這種非預期結果的情況是使用型別比較符
===如下示例(如果
$a 等於
$b,並且它們的型別也相同
) **如下
複製**
//示例4
<?php
$a = '511203199106034578';
$b = '511203199106034579';
if ($a===$b) else
?>
這樣我們就可以得到預期中的
notequal
了
js 字串和數字大小比較
1 純字串比較,轉換成ascii碼在進行比較 2 純數字和純數字字串相比較,則將字串數字隱式轉換成數字再進行比較 3 純數字和非純數字字串比較,都返回false 注意 1.數字和字串比較大小,js會優先將字串轉成數字來比較 如果將數字轉成字串,那麼還要將字串轉成字元編碼才能比較,但是將字串轉成數字就...
關於指標字串和陣列字串的一些經驗
經驗 1.如果用ap和bp的話,是無法引用的,因為它不是指向乙個常量的。2.如果用ap1和bp1的話,可以引用,但是交換的其實是 位址,因為常量區是無法被修改的。3.而如果把函式改為 字元的引用,就是交換的是內容。想想這是為什麼?上面的為什麼指向的是常量區?二 為了解決這個疑問,我們來看看實質的差別...
字串的一些問題 關鍵是KMP演算法
動態順序串 include using namespace std 動態順序串的定義 typedef struct dstring dstring 初始化動態串 void initstring dstring s 串常量的長度 int lenstring char chars return len ...