Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C+中检查等式i==0与0==i的两种方法的差异+; 我正在通过C++中的一个巨大的代码库。作者使用了0==i语法来检查等式。我在C++中已经编码了好几年了;我一直使用I==0语法_C++ - Fatal编程技术网

C+中检查等式i==0与0==i的两种方法的差异+; 我正在通过C++中的一个巨大的代码库。作者使用了0==i语法来检查等式。我在C++中已经编码了好几年了;我一直使用I==0语法

C+中检查等式i==0与0==i的两种方法的差异+; 我正在通过C++中的一个巨大的代码库。作者使用了0==i语法来检查等式。我在C++中已经编码了好几年了;我一直使用I==0语法,c++,C++,前者比后者有什么优势吗?还是仅仅是个人偏好?前者的优点是可以防止程序员意外遗漏等号 if (i = 0) 上述内容是合法的,将i设置为零,并且为假(因为零被视为假) 上述内容在所有情况下都是非法的 今天,大多数编译器都会对if(i=0)发出警告,但这不是一项要求,他们也不总是这样做。0==i被称为“yoda条件”。这当然是个人的偏好,但它确实有优势 在黑暗时代,这个领域的神秘骑士使用它,他们缺乏现代技术来告诉他们何时错误地编写了0=i 编译器将拒绝意外的0=i,但它将接受意外的i=0 这项公约

前者比后者有什么优势吗?还是仅仅是个人偏好?

前者的优点是可以防止程序员意外遗漏等号

if (i = 0)
上述内容是合法的,将
i
设置为零,并且为假(因为零被视为假)

上述内容在所有情况下都是非法的


今天,大多数编译器都会对if(i=0)发出警告,但这不是一项要求,他们也不总是这样做。

0==i
被称为“yoda条件”。这当然是个人的偏好,但它确实有优势

在黑暗时代,这个领域的神秘骑士使用它,他们缺乏现代技术来告诉他们何时错误地编写了
0=i

编译器将拒绝意外的
0=i
,但它将接受意外的
i=0


这项公约在1672年战争后被逐步废除。当代萨满试图编写对其他萨满(也包括精灵、精灵和人类)有意义的代码,并使用在这个千年(也包括他们的眼睛)编写的编译器来避免此类错误。

对于简单整数,正如其他人解释的那样,
0==i
最大限度地降低了拼写错误的风险

但是,如果您有一个重载的
运算符==
,则
0==i
可能是一个错误:

class X
{
public:
    X(int x) : _x(x) {};
    bool operator==(int y) { return _x == y; }
private:
    int _x;
};

....

X x(0);
if (x == 0) // OK
    ;
if (0 == x) // error
    ;

后者有着巨大的(!)优势,像
0=i
这样的输入错误是一个编译器错误。前者在忘记第二个等号时会产生编译器错误
0=i
不编译,
i=0
编译。注释部分有两个答案。为什么?我很欣赏你的解释方式,但我不同意当代的编译器已经摆脱了这一点。我去年做了这个错字,调试起来并不容易。我不记得确切的编译器版本,但它不应该那么旧德布尔!好极了,好极了,艾达姨妈早在19世纪50年代就用过了@有时候你必须把警告级别调高才能得到它,但它通常就在那里。@SonuMishra:这就是眼睛的作用!我明白人们为什么会使用它,但我相信它会让人们产生一种虚假的安全感,我相信如果你没有足够的注意力去发现
=
vs
=
,那么你还缺少什么呢?多加注意。只需阅读您的代码。:)并让您的同事进行代码审查。tl;博士,如果你错过了这个,你几乎肯定错过了其他尤达条件不能解决的问题。通过修正你自己来修正:)我不得不指出,测试代码也会有所帮助。
class X
{
public:
    X(int x) : _x(x) {};
    bool operator==(int y) { return _x == y; }
private:
    int _x;
};

....

X x(0);
if (x == 0) // OK
    ;
if (0 == x) // error
    ;