一個=引發的血案

可能部分童鞋知道了10.5號的加拿大-中國CG交流會,這次事件的尾聲主要圍繞=和==是不是一樣以及如果不一樣有什麼大不了展開。交流會結束後才知道有很多童鞋對這方面的知識比較欠缺,再次做一下詳細說明。

對於不知道此事件的同學,以下說的是VEX。


背景介紹

  • ==,判斷是否相等,任何時候只返回判斷結果
  • =,等號,在任何時候都是賦值用。需要注意的是,這個操作符不但會修改被賦值的變量,而且會返回被賦的值。比如a=10,作爲動作,變量a變成了10,同時這也是一個表達式,其值爲10. 

所以a = b = c = 10就好理解了,其順序爲從右往左,b的值爲c=10,而這個表達式的值是10,所以b就爲10,a依次類推。

而a==(b=c)和a=(b==c)分別有截然不同的含義,童鞋們可以自己思考一下。


那麼問題來了,如果==和=用錯了,會導致什麼大不了的呢?

鑑於Houdini的節點都是非破壞性的程序化操作,每個節點都是可逆的(大不了刪了唄),那可能出現結果怎麼着都不對的現象。比如我們想判斷下如果顏色的R值爲1就讓點沿着法線移動,如果某位看了教程被誤導的同學可能會寫出這樣的代碼:

if(@Cd.r=1)
    @P += @N;

這個結果會是什麼呢?

答案是,無論@Cd是啥,物體的點都會被移動,而且,顏色的R值全都被修改成了1

恐怖的是,這時候Houdini並沒有報任何錯誤,按照某位老師的說法,那這個代碼就是對的,但是結果又不對,該怎麼解釋呢? 如果結果是對的,那就是符合Sidefx的理念,如果結果不對代碼又是對的,那恐怕是你的代碼雖然“對”但不符合Sidefx的理念了吧。

看到這裏你還會覺得只要效果對管他怎麼寫的都行嗎?


讓我們再來看看一種更加通用的情況,,如果我想刪除服務器的重複文件,只要這倆的特徵值一樣就刪除第一個文件,按照sidefx的理念我們會這麼寫:


int id1 = hash(file1), id2 = hash(file2);

// use hash value to determine whether two files are identical
if(id1 = id2)
    deleteFile(file1);

非0值會當成True,親愛的朋友們啊,你能想想這個代碼被執行的後果嗎?



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章