一个=引起的血案

可能部分童鞋知道了10.5号的加拿大-中国CG交流会,此次事件的尾声主要围绕=和==是否是同样以及若是不同有什么大不了展开。交流会结束后才知道有不少童鞋对这方面的知识比较欠缺,再次作一下详细说明。服务器

对于不知道此事件的同窗,如下说的是VEX。ide


背景介绍spa

  • ==,判断是否相等,任什么时候候只返回判断结果
  • =,等号,在任什么时候候都是赋值用。须要注意的是,这个操做符不但会修改被赋值的变量,并且会返回被赋的值。好比a=10,做为动做,变量a变成了10,同时这也是一个表达式,其值为10. 

因此a = b = c = 10就好理解了,其顺序为从右往左,b的值为c=10,而这个表达式的值是10,因此b就为10,a依次类推。code

而a==(b=c)和a=(b==c)分别有大相径庭的含义,童鞋们能够本身思考一下。blog


那么问题来了,若是==和=用错了,会致使什么大不了的呢?教程

鉴于Houdini的节点都是非破坏性的程序化操做,每一个节点都是可逆的(大不了删了呗),那可能出现结果怎么着都不对的现象。好比咱们想判断下若是颜色的R值为1就让点沿着法线移动,若是某位看了教程被误导的同窗可能会写出这样的代码:事件

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

这个结果会是什么呢?hash

答案是,不管@Cd是啥,物体的点都会被移动,并且,颜色的R值全都被修改为了1class

恐怖的是,这时候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,亲爱的朋友们啊,你能想一想这个代码被执行的后果吗?