print不是函數

這個源自於一個看似很詭異的問題:

 if (print("1/n") && print("2/n") && print("3/n") && print("4/n")) {     ; }

你期待這段代碼輸出什麼呢?

實際上的輸出是:

 4 111

很多時候我們會忽略了print是一個語法結構(language constructs), 他並不是一個函數, 參數的list並不要求有括號(即使你寫了括號, 括號也會在語法分析階段被忽略), 他只是一個永遠返回結果是1的”表達式(expr)”:

 expr :    T_PRINT expr  | '(' expr ')' ;

所以其實上面的代碼在php看來是:

 if (print ("1/n" && print ("2/n" && print ("3/n" && print "4/n")))) {   ; }

所以就是, 輸出4, 然後輸出 “3/n” && print的結果1 , 然後輸出 “2/n” && 1, 最後是 “1/n” && 1

而如果想要達到上面代碼的本身想要的意圖, 我們應該這麼寫:

 if ((print "1/n") && (print "2/n") && (print "3/n") && (print "4/n")) {     ; }

Leave a Reply

Your email address will not be published. Required fields are marked *