我遇到了这个C ++模板
template <typename T> int sgn(T val) {
return (T(0) < val) - (val < T(0));
}
而且我必须承认我并没有真正理解它。 如果我尝试做一个数字应用程序,让我们说-1: (0 <( - 1)) - ( - 1 <0)=&gt;错 - 真的我得到了Bool的减法。 它是如何工作的?有人能解释一下编译器会做的不同步骤吗?
答案 0 :(得分:1)
有隐含的转化:True=>1
和False=>0
。
您需要检查两个条件以查看该值是否等于零 - 这是如何定义signum的。如果您只想检查大于或小于0,那么您可以通过单一比较来实现。
尽管如此,让您的示例包含-1
和发布的模板,结果是:
return False - True;
=&gt; return 0 - 1;
=&gt; return -1;
答案 1 :(得分:1)
如果为0,则返回-1,如果0,则返回0 让我们说-1:
(T(0) < val) - (val < T(0))
0<-1 false or 0
-
-1 < 0 true or 1
0 - 1 = -1
让我们说0
(T(0) < val) - (val < T(0))
0<0 false or 0
-
0 < 0 false or 0
0 - 0 = 0
让我们说1:
(T(0) < val) - (val < T(0))
0<1 true or 1
-
1 < 0 false or 0
1 - 0 = 1
答案 2 :(得分:0)
false和true将转换为0和1.因此,如果一个或两个表达式的计算结果为false,则得到-1,0,1个结果。这是signum函数的正典定义。
PS.Thats不是一个有效的模板,为了更好的工作,应该有三个专业。
这个问题的特点是解释这些问题: Is there a standard sign function (signum, sgn) in C/C++?