为什么首选 if( 常量 == 变量 ) 而不是 if ( 变量 == 常量 )
Why if( constant == variable ) is preferred instead of if ( variable == constant )
可能的重复项:
如何检查相等?(0 == i( 或 (i == 0(
为什么在 C# 中经常看到"null != 变量"而不是"变量 != null"?
为什么一些有经验的程序员会这样写表达式?
NULL != C++中的值是什么意思?
例如
int k =5;
if( 5 == k )
{
}
优先于
if (k == 5)
{
}
它是否仅用于格式化目的或背后有任何原因?
因为这种形式使得通过忘记其中一个等号来引入错误变得更加困难。想象一下,如果你这样做:
if (k = 5)
这本来是作为比较,但现在是一项作业!更糟糕的是,它是合法的,它会以多种方式搞砸你的程序(k
的值被改变,条件总是计算为 true
(。
与此形成对比
if (5 = k)
这是不合法的(您不能分配给文本(,因此编译器会立即将其标记为错误。
也就是说,这种编写代码(条件中的赋值(的风格在今天并不像以前那样普遍。大多数现代编译器会将其标记为警告,因此不太可能未被发现。就个人而言,我不喜欢第二种形式,并且由于编译器可以提供帮助,因此我不使用它。
如果你打错了字并写错了
if (k = 5) // instead of ==
那么你可能只是引入了一个难以找到的错误。(实际上,它曾经很难找到。如今,大多数编译器会将其标记为警告。
但是,这将导致编译时错误
if (5 = k)
顺便说一句,这种风格被称为尤达条件:-(
这是为了避免错误
if( k = 5 ) {
}
这总是等于真实。
A.谁说这是首选?!
我能想到的唯一原因是避免:
int k =5;
if( 5 = k )//notice one "="
{
}
像这样,你会得到一个编译错误,而另一种方式将起作用。 但我认为它的可读性较低,也不太受欢迎。
首先,大多数人更喜欢第二种形式,因为它感觉"更自然";第一种形式感觉是"颠倒的",实际上通常被称为"尤达条件"。
使用第一种形式背后的基本原理是避免在键入=
时意外分配,而不是错误地==
。由于在条件中您可以编写任何表达式,因此允许=
,因此在错误键入指令的情况下
if(k = 5)
{
}
不会检查 k
是否等于 5
,但会将5
分配给k
,并且由于 =
返回对其左侧运算符的引用,因此条件将被评估为 true,并且if
主体将始终被执行。
另一方面,如果您在尤达条件中键入=
而不是==
,您将获得
if(5 = k)
{
}
这会导致编译错误,因为您无法为文字 (5( 分配任何内容。
虽然它们看起来像个好主意,但"Yoda 条件"看起来很奇怪,最重要的是,如果你在条件表达式中编写赋值,几乎任何打开警告的优秀编译器都会警告你,所以大多数人只是使用"自然外观"形式。
这是因为一个常见的拼写错误是输入=
而不是==
。
- 用C++中的一个变量定义一个常量
- 通过多个头文件使用常量变量
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 非常量变量只读位置的赋值
- 多个"常量引用"变量可以共享同一个内存吗?
- 使用大量已知常量变量的正确方法
- 常量成员函数中成员变量的类型
- 无法在具有常量变量大小的类中创建堆栈分配数组
- 错误:constexpr 变量'struct2Var'必须由常量表达式初始化
- 这些语句是否等效(静态变量、常量变量和泛型)
- 如何将变量内容常量转换为 std::array 的大小?
- 我应该使我的局部变量常量还是可移动的
- 为什么我可以改变常量对象中的成员变量,这是返回常量对象函数的结果?
- 对全局变量的非常量引用的初始化无效
- 如何在 C++ 中的 wcstok 中使用常量 WCHAR* 变量?
- 将 static_cast<int>(-15) 分配给静态常量字符类型变量
- 全局变量/常量的替代方案
- 为什么首选 if( 常量 == 变量 ) 而不是 if ( 变量 == 常量 )
- 在c++中声明一个变量常量有什么意义