gpt4 book ai didi

c++ - 在哪种情况下 if(a=b) 是个好主意?

转载 作者:IT老高 更新时间:2023-10-28 23:22:14 26 4
gpt4 key购买 nike

Possible Duplicate:
Inadvertent use of = instead of ==

C++ 编译器通过您编写的警告告知您,

if( a = b ) { //...

而且你肯定想写的可能是一个错误:

if( a == b ) { //...

但是是否存在应该忽略警告的情况,因为这是使用此“功能”的好方法?我看不出任何代码清晰的原因,那么它是否有用?

最佳答案

两个可能的原因:

  1. 分配和检查

    = 运算符(未覆盖时)通常返回它分配的值。这是为了允许诸如 a=b=c=3 之类的语句。根据您的问题,它还允许您执行以下操作:

    bool global;//a global variable

    //a function
    int foo(bool x){

    //assign the value of x to global
    //if x is equal to true, return 4
    if (global=x)
    return 4;

    //otherwise return 3
    return 3;
    }

    ...等价于但短于:

    bool global;//a global variable

    //a function
    int foo(bool x){

    //assign the value of x to global
    global=x;

    //if x is equal to true, return 4
    if (global==true)
    return 4;

    //otherwise return 3
    return 3;
    }

    另外,应该注意(正如 Billy ONeal 在下面的评论中所说),当 = 运算符的左侧参数实际上是一个指定了 conversion operator 的类时,这也可以工作对于可以强制(隐式转换)为 bool 的类型。换句话说,(a=b) 将评估为 truefalse 如果 a 是可以强制为 bool 值的类型.

    所以下面的情况与上面类似,除了 = 的左侧参数是对象而不是 bool 值:

    #include <iostream>
    using namespace std;

    class Foo {
    public:
    operator bool (){ return true; }
    Foo(){}
    };

    int main(){
    Foo a;
    Foo b;

    if (a=b)
    cout<<"true";
    else
    cout<<"false";
    }

    //output: true

    注意: 在撰写本文时,上面的代码格式存在错误。我的代码(检查源代码)实际上具有正确的缩进、移位运算符和行距。 < 应该是 <'s,并且每行之间不应该有很大的差距。

  2. 重写的 = 运算符

    由于 C++ 允许覆盖运算符,有时 = 会被覆盖以执行与原始类型不同的操作。在这些情况下,对对象执行 = 操作可能会返回一个 bool 值(如果这就是该对象类型的 = 运算符被覆盖的方式)。

    所以下面的代码会以 b 作为参数对 a 执行 = 操作。然后它会根据该操作的返回值有条件地执行一些代码:

    if (a=b){
    //execute some code
    }

    这里,a 必须是一个对象,而 b 将是由 = 运算符的覆盖所定义的正确类型a 类型的对象。要了解有关运算符覆盖的更多信息,请参阅包含 C++ 示例的维基百科文章:Wikipedia article on operator overriding

关于c++ - 在哪种情况下 if(a=b) 是个好主意?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3122284/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com