可能部分童鞋知道了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,親愛的朋友們啊,你能想想這個代碼被執行的後果嗎?