这是C代码:
/* LERP(a,b,c) = linear interpolation macro, is 'a' when c == 0.0 and 'b' when c == 1.0 */
#define LERP(a,b,c) (((b) - (a)) * (c) + (a))
http://www.brucelindbloom.com/index.html?Eqn_XYZ_to_T.html
等于这个C#代码?
private static double LERP(double a, double b, double c) { return (((b) - (a)) * (c) + (a)); }
答案 0 :(得分:13)
没有。 请考虑以下事项:
LERP(x++,1,2);
c代码也可能有两次增加x的副作用[它是@phresnel所提到的未定义],而c#代码是完美定义的,并且只会增加x一次。
结果也可能不同,因为第一个a
和第二个[在宏中]可能有不同的值,因为它可能在第一个中有所增加。
答案 1 :(得分:8)
答案 2 :(得分:5)
从技术上讲,不是他们不平等。 C宏可以采用任何类型:int
,float
,byte
等。
你的C#版只能处理double,没有显式的强制转换。您需要根据需要为其他类型添加重载。
答案 3 :(得分:2)
它基本相同,是的。你也可以摆脱一些括号:
private static double LERP(double a, double b, double c) { return (b - a) * c + a; }
答案 4 :(得分:2)
要获得你在C中所拥有的东西,你可以使用:
delegate double ValueGetter();
static double LERP(ValueGetter a, ValueGetter b, ValueGetter c) { return (b() - a()) * c() + a(); }
但我同意amit。这可能与你在C中的相同(但仅用于其他类型的双倍)仍然可能不是你真正想要的...(使用委托你可以将'i ++'设置为,而不仅仅是i ++的结果)
答案 5 :(得分:1)
是的,但你可以写得更简单:
return (b - a) * c + a;