C++ |如何循环 If 语句而不每次都返回值

C++ | How Do I Loop an If Statement Without Returning a Value Each Time

本文关键字:语句 返回值 If 何循环 循环 C++      更新时间:2023-10-16

>我在函数中有一个循环,它通过数组递增,检查每个元素以查看它是否与函数的参数匹配。

我的问题是返回值的要求。由于返回值会完成函数,如果一个错误的匹配项返回 false,并且我需要在每个控制路径上返回一个值,那么我将无法检查数组中的任何其他元素以查看它们是否匹配。

我的大部分经验都是在AS3中,这种函数结构确实有效。我将如何在C++中正确构建此功能?

功能:其目的是检查输入的命令是否存在,如果真或假,则返回布尔值

bool Commands(string _input)
{
string cmds[] = { "login", "logout", "exit" };
int i = 0;
do {
if (_input == cmds[i])
{
return true;
}
else
{
if (i == sizeof(cmds))
{
return false;
}
}
i++;
} while (i < sizeof(cmds));
}

我建议一些改进:

sizeof(cmds)返回cmds的大小(以字节为单位),在 64 位系统上将sizeof(string) * 3或例如 96;您的循环将从数组的末尾运行,导致未定义的行为。一种选择是使用sizeof(cmds)/sizeof(*cmds)来获取元素的数量,但出于您的目的,使用带有初始值设定项列表的std::vector会更简单:

std::vector<string> cmds { "login", "logout", "exit" };

接下来,您可以将do循环替换为for循环,并使用std::vector.size()成员函数进行sizeof。如果输入不匹配,则无需return并继续循环的下一次迭代。如果函数在循环后未返回,则未找到任何项目,因此您可以return false.

for (size_t i = 0; i < cmds.size(); ++i)
if (_input == cmds[i])
return true;
return false;

您还可以将循环替换为从标准<algorithm>标头调用std::find算法:

return std::find(std::begin(cmds), std::end(cmds), _input) != std::end(cmds);

循环时,找到要查找的值时返回true。否则,当循环完成时,您只需在循环后返回false即可。

bool Commands(string _input) {
string cmds[] = { "login", "logout", "exit" };
int i = 0;
do {
if (_input == cmds[i]) {
return true; // we found it!
}
i++;
} while (i < sizeof(cmds));
return false; // we didn't find it.
}

对于初学者来说,最好将参数声明为常量引用。 无需声明std::string类型的对象数组。声明字符串文本数组要好得多。

循环错误。例如,这个表达式sizeof(cmds)在诸如这样的条件下不会产生差异

if (i == sizeof(cmds))

数组中元素数的计算方式如下

sizeof(cmds) / sizeof( *cmds)

使用标准算法可以大大简化该功能。

只是写

#include <iostream>
#include <iomanip>
#include <string>
#include <algorithm>
#include <iterator>
bool Commands( const std::string &s )
{
const char * cmds[] = { "login", "logout", "exit" };
return std::find( std::begin( cmds ), std::end( cmds ), s ) != std::end( cmds );
}
int main() 
{
std::cout << std::boolalpha << Commands( "logout" ) << std::endl;
std::cout << std::boolalpha << Commands( "hello" ) << std::endl;
return 0;
}

程序输出为

true
false

如果你想在函数中使用循环,那么它看起来像下面显示的那样

#include <iostream>
#include <iomanip>
#include <string>
bool Commands( const std::string &s )
{
const char * cmds[] = { "login", "logout", "exit" };
const size_t N = sizeof( cmds ) / sizeof( *cmds );
size_t i = 0;
while ( i < N && s != cmds[i] ) i++;
return i != N;
}
int main() 
{
std::cout << std::boolalpha << Commands( "logout" ) << std::endl;
std::cout << std::boolalpha << Commands( "hello" ) << std::endl;
return 0;
}

当一个简单的函数有多个出口时,这不是一种好的编程风格,而且在大多数情况下没有必要。