C++ |如何循环 If 语句而不每次都返回值
C++ | How Do I Loop an If Statement Without Returning a Value Each Time
>我在函数中有一个循环,它通过数组递增,检查每个元素以查看它是否与函数的参数匹配。
我的问题是返回值的要求。由于返回值会完成函数,如果一个错误的匹配项返回 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;
}
当一个简单的函数有多个出口时,这不是一种好的编程风格,而且在大多数情况下没有必要。
- 从python中调用C++函数并获取返回值
- 为什么模板类中的对象不能返回值
- 返回值优化:显式移动还是隐式
- C - 程序返回值而无需返回语句
- C++ |如何循环 If 语句而不每次都返回值
- 带有 if 语句的自动函数不会返回值
- 缺少返回语句的非 void 函数的返回值是多少?
- 错误:void 值未被忽略,因为它应该被忽略,错误:返回语句具有值
- 如何在 if 语句中正确使用 malloc() 返回值
- C++开关语句返回奇怪的值
- 返回语句不返回值
- 错误:函数中的return语句没有值,返回“void*”[-fpermission]
- 空的C++if语句返回零值
- 为什么C++未指定 return 语句时不默认构造返回值?
- 如果一个指定返回类型为int的函数没有任何返回语句,即不返回值,它会返回垃圾值吗
- 为什么return之后的语句会改变返回值?
- 给新变量赋返回值警告在c++的delete语句中出现
- 逗号分隔语句中返回值的生命周期
- 编译器在发布中优化了我的部分代码,即使返回值被照顾并锁定到if语句
- 返回语句返回一个空指针值而不是期望的值