一个=引发的血案

可能部分童鞋知道了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,亲爱的朋友们啊,你能想想这个代码被执行的后果吗?


一个=引发的血案_第1张图片

你可能感兴趣的:(Houdini)