为什么在 while 循环中返回表达式不起作用
Why return expression in while loop doesn't work
下面的代码是count int m可以由数组数据中的哪个数字组成,但是退出的return 0;
表达式不起作用,它会发生堆栈损坏,我必须使用exit(0);
,为什么?
#include <iostream>
#include <cstdlib>
void increase(bool seq[], int size);
constexpr int n = 5;
int main()
{
int m, data[n];
bool seq[n];
std::cin >> m;
for (int i = 0; i < n; ++i) {
std::cin >> data[i];
seq[i] = false;
}
while (true) {
bool isEnd = true;
for (int i = 0; i < n; ++i)
if (!seq[i])
isEnd = false;
if (isEnd) {
std::cout << "IMPOSSIBLE!!!";
return 0;
}
int sum = 0;
for (int i = 0; i < n; ++i)
if (seq[i])
sum += data[i];
if (sum == m) {
for (int i = 0; i < n; ++i)
if (seq[i])
std::cout << data[i] << " ";
std::cout << std::endl;
return 0;
}
increase(seq, n);
}
}
void increase(bool array[], int size)
{
bool isCarry = true;
for (int i = size; i >= 0; --i) {
if (isCarry) {
isCarry = array[i];
array[i] = !array[i];
}
}
}
此代码不正确
void increase(bool array[], int size)
{
bool isCarry = true;
for (int i = size; i >= 0; --i) {
if (isCarry) {
isCarry = array[i];
array[i] = !array[i];
}
}
}
它应该是
void increase(bool array[], int size)
{
bool isCarry = true;
for (int i = size - 1; i >= 0; --i) {
if (isCarry) {
isCarry = array[i];
array[i] = !array[i];
}
}
}
大小为 N 的数组的有效索引为 0 到 N - 1(含(。
这是有争议的,但你可以increase
for (int i = size; i --> 0; /*intentionally blank*/){
这样做的好处是它也适用于unsigned
类型。-->
是幻灯片运算符,当然,根本不是真正的运算符,而是--
后跟>
.
并非所有软件公司都允许这样做。我愿意。也许那是因为我更像是一个数学程序员,随着我长大,我发现这是一种倒计时到零的惯用方式,尤其是对于unsigned
类型,我认为你的size
和i
应该是 - 在这种情况下,i >= 0
总是true
的。
相关文章:
- (C++)分析树以计算返回错误值的简单算术表达式
- 为什么在 while 循环中返回表达式不起作用
- 函数返回的 rvalue 引用(表达式)是 xvalue - 但没有标识?
- 如何在一个表达式中生成并返回结果?
- 为什么新表达式可以正确生成指针类型,即使它应该返回 void*?
- 如何使用条件表达式返回对象指针?
- 仅当返回表达式有效时才启用模板
- C++:从捕获函数参数的函数返回 lambda 表达式
- 编译器在传递 const 变量时返回错误:模板参数不是常量表达式
- C++如果使用 lambda 表达式的语句返回 true,但输出来自 false,为什么
- 将返回表达式隐式转换为布尔值
- 从 lambda 表达式返回布尔值时出错
- 在 if 语句中返回布尔值的 lambda 表达式
- 错误:二进制表达式('float' 和 'float')返回的无效操作数 (x & (1 << 31)) == 0
- C++包含返回的宏表达式(如 Rust 的尝试!
- 在给定表达式的情况下返回对类型的引用时出错:“cond ?*这个 : 投掷()'
- IF-ELSE语句的Lambda表达式的返回类型扣除
- 从重载运算符返回引用,并使用临时对象返回表达式
- 在返回表达式中奇怪地使用 & 运算符
- 如何在使用static_assert时避免关于无返回表达式的警告