for 迴圈在很多的程式語言中都被支援,是一種常見的迴圈用法,也算是我們學習每門程式語言中最基礎的知識點。但正是因為基礎,所以才容易被忽略,久而久之,甚至會誤解。本文 phpha 就對 php 中的 for 迴圈進行複習,不求溫故而知新,但求能矯枉過正。
首先看下 php 手冊中對 for 迴圈的描述。(php 4, php 5, php 7)
for 迴圈是 php 中最複雜的迴圈結構。它的行為和 c 語言的相似。 for 迴圈的語法是:
for (expr1; expr2; expr3)
statement
第乙個表示式(expr1)在迴圈開始前無條件求值(並執行)一次。
expr2 在每次迴圈開始前求值。如果值為 true,則繼續迴圈,執行巢狀的迴圈語句。如果值為 false,則終止迴圈。
expr3 在每次迴圈之後被求值(並執行)。
每個表示式都可以為空或包括逗號分隔的多個表示式。表示式 expr2 中,所有用逗號分隔的表示式都會計算,但只取最後乙個結果。expr2 為空意味著將無限迴圈下去(和 c 一樣,php 暗中認為其值為 true)。這可能不像想象中那樣沒有用,因為經常會希望用有條件的 break 語句來結束迴圈而不是用 for 的表示式真值判斷。
其實是非常基礎的知識點,對於以上官方描述,相信大家一掃而過而不會有任何的疑問。
那麼為什麼文章開頭我卻說本文是要來矯枉過正呢?這是因為 phpha 最近在補充資料結構與演算法相關知識點,在基於理論分析的基礎上,看到快速排序演算法的**實現,對其 for 迴圈中的某乙個變數的值產生了懷疑。
快速排序的**就不貼了,目前就看下面的簡化**:// [a]
for ($i = 0; $i < 5; ++ $i) {
continue;
// 5
echo $i;
// [b]
for ($i = 0; $i < 5; ++ $i) {
break;
// 0? 1?
echo $i;
那麼,上面的 [a] [b] 兩段**,最終輸出的 $i 的值分別是多少呢?其實對於 [a] 段沒什麼疑問,肯定是 5,問題在於 [b] 段**的輸出值,到底是 0 還是 1。
對於這個問題可以回到上文中官方描述的內容,也就是對於 for 迴圈裡面第三個表示式的描述,如下:expr3 在每次迴圈之後被求值(並執行)
重點就在於 迴圈之後 這四個字。再回到 [b] 段**,其中第 1 次迴圈就遇到了 break,並沒有迴圈成功,不滿足 迴圈之後 的條件,因此,$i 的值不能遞增,那麼依然是 0。
藉著這個問題,咱們順便再來說下 php 中的遞增與遞減,即 $i++ / ++$i / $i-- / --$i 相關知識點。例子名稱效果
++$a前加$a 的值加一,然後返回 $a
$a++後加返回 $a,然後將 $a 的值加一
--$a前減$a 的值減一,然後返回 $a
$a--後減返回 $a,然後將 $a 的值減一
遞增與遞減類似,因此就只說下遞增的兩種區別即可。$a = 1;
$b = $a++; // 執行後:$a==2 $b==1
$b = ++$a; // 執行後:$a==3 $b==3
以上,就是本文的全部內容。
六 PHP迴圈之 for while迴圈
描述 迴圈就是自動執行某段 迴圈執行。語法 for 變數初始化 條件表示式 變數變化 變數初始化 迴圈的開始,給乙個開始迴圈的變數。如 i 1 條件表示式 必須給迴圈乙個可以退出的條件,否則就是死迴圈。i 10 變數變化 讓初始化的值發生改變,一直的達到條件為止。i 示例 輸出從1到100的數 如果...
PHP結束符省略
我是菜鳥,剛學習php,把學習過備的問題記錄下來,以備查詢。今天就記錄一下php 結束符 也就是 何時可以省略的問題。首先整個php檔案都沒有html元素標籤。那麼就是純php 這時候肯定可以省略結束符的。有人說php和html混合編寫就不能省略,否則,也就是只有php 那麼可以省略。其實這句話是個...
PHP迴圈語句
迴圈語句是 為了解決程式設計中 需要重複一段指令直到滿足特定條件為止 的一種迴圈機制 1 while while語句指定了乙個條件,在其嵌入 結束執行前,必須滿足這個條件。語法 while expression while expression while和do.while在功能上相似 唯一的區別在...