【问题标题】:C++ returning wrong boolean values when in function [duplicate]C ++在函数中返回错误的布尔值[重复]
【发布时间】:2015-12-23 19:13:34
【问题描述】:

我正在编写一个函数来检查数组的所有值是否为真。如果我写

int main(){
bool Janmaat[3]={true, true, true};

int size_arr=sizeof(Janmaat)/sizeof(Janmaat[0]);
bool value=true;
int i;

for(i=0;i<size_arr;i++){
    if(!Janmaat[i]){
        value=false;
    }
}
cout<<value;
return 0;
}

值保持为真。如果我把它封装成一个函数

bool all_true(bool arr[]){

int size_arr=sizeof(arr)/sizeof(arr[0]);
bool value=true;
int i;

for(i=0;i<size_arr;i++){
    if(!arr[i]){
        value=false;
    }
}

return value;

}

int main(){

bool Janmaat[3]={true, true, true};

cout<<all_true(Janmaat);
return 0;
}

它返回假。怎么回事?

【问题讨论】:

    标签: c++ function boolean


    【解决方案1】:

    当一个数组被传递给一个需要指针的函数时,它会自动衰减为一个指针。这意味着数组不能按值传递。 arr from all_true 是一个指针。 sizeof(arr) 因此将产生 指针 的大小,而不是整个数组。

    不同的处理方式:

    1. 将大小作为参数传递。将声明更改为

      bool all_true(bool arr[], size_t size)
      

      并相应地调整代码。

    2. 传递std::array 或std::vector(std::bitset 在技术上也是可行的)。由于这是 C++,这肯定是更好的选择。


    注意事项:

    • 如果一个元素是false,all_true肯定会返回false。要缩短运行时间,您可以立即在 if 语句中 return false;。

    你知道莱纳斯·托瓦兹吗?发明 Linux 并经常侮辱 Linux 内核“开发人员”的人(有些人应该加双引号;有些人不应该)?
    This 那么你可能会感兴趣。 :-)

    【讨论】:

    • 函数参数为指针时衰减为指针。传递给任何旧函数时,它不会衰减为指针。
    • @cad 那么声明数组大小的唯一方法是什么?
    • @Plinth 我添加了一些东西。
    • @Plinth 你不需要。 all_of(begin(Janmaat), end(Janmaat), [](bool b) { return b; });
    • 3.使函数成为模板并通过引用接受数组,这样它就不会衰减。
    猜你喜欢
    • 1970-01-01
    • 2015-02-08
    • 2017-05-03
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 2014-01-21
    • 2012-07-15
    • 2022-11-30
    相关资源
    最近更新 更多