为什么2个NULL指针不能评估为false?

时间:2012-04-10 15:18:57

标签: c++ pointers null boolean

我有一个相对简单的算法,它会遍历std :: vector,寻找两个相邻的元组。一旦找到X值左右两侧的元组,我就可以在它们之间进行插值。不知何故,这有效:

  std::vector<LutTuple*>::iterator tuple_it;
  LutTuple* left = NULL;
  LutTuple* right = NULL;
  bool found = 0;

  // Only iterate as long as the points are not found
  for(tuple_it = lut.begin(); (tuple_it != lut.end() && !found); tuple_it++) {
    // If the tuple is less than r2 we found the first element
    if((*tuple_it)->r < r) {
        left = *tuple_it;
    }
    if ((*tuple_it)->r > r) {
        right = *tuple_it;
    }
    if(left && right) {
        found = 1;
    }
  }

虽然:

  std::vector<LutTuple*>::iterator tuple_it;
  LutTuple* left = NULL;
  LutTuple* right = NULL;

  // Only iterate as long as the points are not found
  for(tuple_it = lut.begin(); tuple_it != lut.end() && !left && !right; tuple_it++) {
    // If the tuple is less than r2 we found the first element
    if((*tuple_it)->r < r) {
        left = *tuple_it;
    }
    if ((*tuple_it)->r > r) {
        right = *tuple_it;
    }
  }

没有。这是为什么?我希望像这样的两个NULL pt在被否定时一起评估为真。

3 个答案:

答案 0 :(得分:5)

第二个循环将在找到任何一个循环后立即终止。将条件更改为:

tuple_it != lut.end() && !(left && right)

tuple_it != lut.end() && (!left || !right)

继续,直到找到它们。

答案 1 :(得分:4)

存在一个逻辑问题。

在您的第一个片段中(基本上)!(left && right)

在第二个代码段中,您有!left && !right

那些不等同。

如果您构建真值表,您会发现!(left && right)等同于(!left || !right)

答案 2 :(得分:0)

  

我希望像这样的两个NULL pt一起评估为true   否定。

这没有意义。不要“否定”指针并期望在强制进入布尔表达式时它们将评估什么。相反,我建议明确地将它们与NULL进行比较。

另外,移动复杂的布尔表达式以使循环继续进入单独的行,否则很难在逻辑上遵循代码。