我一直在玩C ++,发现了一些我无法解释的东西。
使用以下代码:
#include <iostream>
using namespace std;
class Foo
{
private:
int bar;
public:
Foo():bar(0){}
Foo(int a):bar(a){}
~Foo(){}
int getVal() const { return bar;}
};
bool operator < (const Foo& a, const Foo& b){
std::cout << a.getVal() << " " << b.getVal() << std::endl;
return a.getVal() < b.getVal();
}
int main() {
Foo a(12);
Foo b(15);
if(NULL < (a,b) ) /* */
std::cout << "lesser" << std::endl;
return 0;
}
我得到这个作为输出忽略完全参数“a”但得到“b”
0 15
lesser
如果我将条件改为
a < b or operator<(a,b)
我会得到(这是所希望的行为)
12 15
lesser
我认为这可能是一些编译器的东西,但我想确定
答案 0 :(得分:5)
在C ++中Transaction.by_month(2016, 'October').sum(:amount)
behaves like zero。进行比较时,C ++在左侧应用User.find(2).transactions.by_month(2016, 'October').sum(:amount)
构造函数,在右侧应用comma operator以获得您看到的结果。
要禁止NULL
在构造函数上转换为Foo(int)
使用explicit
指示符时的行为(需要C ++ 11或更高版本):
NULL
答案 1 :(得分:-3)
此代码
if(NULL < (a,b) ) /* */
std::cout << "lesser" << std::endl;
有效转换为
if(NULL < true ) /* */
std::cout << "lesser" << std::endl;
因为在C ++中,任何非零值都是true,所以将true视为1然后代码看起来像
if(NULL < 1 ) /* */
std::cout << "lesser" << std::endl;
相比之下,NULL相当于&#39; 0&#39;然后代码变成
if(0 < 1 ) /* */
std::cout << "lesser" << std::endl;
这是真的。
如果函数返回false
,if
条件将评估为false,因为`false&#39;在C ++中为零
if(NULL < false ) /* */
std::cout << "lesser" << std::endl;
变为
if(0 < 0) ) /* */
std::cout << "lesser" << std::endl;
评估为false。
希望它澄清