C ++建议围绕赋值的括号用作真值

时间:2016-02-01 19:25:06

标签: c++ codeblocks compiler-warnings objective-c++

我的代码中有一些问题:

Employees.cpp

void Employees::delete_employee()
{
    int employee_number;

    cout<<"\n..."<<endl<<endl;
    cout<<"Give me the number:";
    cin>>Employee_number;

    for(std::vector<EmployeeStruct>::size_type i = 0; i != lista.size(); i++)
        {
            if (employee_number = lista[i].Employee_number)
            {
                lista.erase(lista.begin() + i);
            }
        }
    cout<<"..."<<endl<<endl;
    cout<<"--------------------------------"<<endl;

}

当我编译我的代码时,我看到类似的东西:警告:建议用作真值的括号括号[-Whatarentheses] 我真的不知道如何处理它。也许这不是一个严重的问题,但我的计划并不像我想的那样工作。 (此代码应删除员工)

main.cpp 中,我有:

    case 4:
        {
            Pracownicy p;
            p.usun_pracownika();
        }
    break;

也许有人可以帮助我。

5 个答案:

答案 0 :(得分:2)

  

我真的不知道该怎么做。

这取决于你打算做什么。

如果您没有打算分配,而是比较相等,那么您应该修复代码以使用相等运算符:==

如果您打算分配,那么您可以:a)忽略警告或b)添加括号,告诉编译器您确实打算进行分配并且这不是错误。或者由Christian Hackl评论c)将分配和比较分成两个语句以提高可读性。

您的代码中还有另一个错误。擦除会移动剩余的元素。下一个元素不再是i++,因此您最终会在擦除后跳过元素。如果擦除多个元素,这也是低效的。有关更好的方法,请参阅erase-remove idiom

答案 1 :(得分:0)

我认为这是一个非常常见的错误:

if (employee_number == lista[i].Employee_number)
                    ^^
{
     lista.erase(lista.begin() + i);
}

您在此处混淆了==赋值运算符的布尔检查=运算符,无论是拼写错误还是错误。

答案 2 :(得分:0)

  

我真的不知道该怎么做。

使用等于比较而不是分配,这是警告在大多数情况下最终建议的内容:

 if (employee_number == lista[i].Employee_number)
                  // ^^

或使用括号

清楚地说明你想要的内容
if ((employee_number = lista[i].Employee_number))

虽然编译器没有这么好的警告。

答案 3 :(得分:0)

一个简单的错误。你写道:

 if (employee_number = lista[i].Employee_number)

if (employee_number == lista[i].Employee_number)

答案 4 :(得分:0)

您身边的主要问题是无意中使用了赋值运算符=而不是预期的比较==

在语言方面,这个常见问题是通过从原始C继承的两个风险增强功能启用的,即正式条件接受任何转换为​​{{1}的对象而且,为了支持多任务,赋值是一种表达而不是一种陈述。

您很幸运能够使用编译器和产生警告的选项进行编译:无法保证此类警告。

保证获取错误的方法是让左侧是一个无法分配的表达式,例如

  • 在任何有意义的地方自由地使用bool

在给定的情况下,而不是

const

你可以做得更安全

void Employees::delete_employee()
{
    int employee_number;

    cout<<"\n..."<<endl<<endl;
    cout<<"Give me the number:";
    cin>>Employee_number;

    for(std::vector<EmployeeStruct>::size_type i = 0; i != lista.size(); i++)
        {
            if (employee_number = lista[i].Employee_number)
            {
                lista.erase(lista.begin() + i);
            }
        }
    cout<<"..."<<endl<<endl;
    cout<<"--------------------------------"<<endl;

}

如果使用auto fail() -> bool ...; auto line_from( istream& stream ) -> string { string line; getline( stream, line ) or fail(); return line; } void Employees::delete_employee() { cout<<"\n..."<<endl<<endl; cout<<"Give me the number:"; int const Employee_number = to_string( line_from( cin ) ); for(std::vector<EmployeeStruct>::size_type i = 0; i != lista.size(); i++) { if (employee_number == lista[i].Employee_number) { lista.erase(lista.begin() + i); } } cout<<"..."<<endl<<endl; cout<<"--------------------------------"<<endl; } 代替==,则此代码根本不会编译,而使用=的奖励有助于避免从{{1}输入值时出现的许多常见问题}}

另一种修复方法是通过宏重新定义getline,或定义一个扩展为安全使用cin的宏。第一种是技术上可行的,但如果包含任何标准库头,则形式上是未定义的行为,通常就是这种情况。第二个是代码的严重(通常是不可接受的)丑化,并将使维护成为一场噩梦。我记得曾经为其中一个Unix shell做过类似的事情。由于除了原始程序员之外没有人理解任何代码,因此它的寿命很短。