为啥这个 stl 函数调用会导致不正确的布尔评估? [复制]

     2023-02-17     107

关键词:

【中文标题】为啥这个 stl 函数调用会导致不正确的布尔评估? [复制]【英文标题】:Why does this stl function call result in an incorrect boolean evaluation? [duplicate]为什么这个 stl 函数调用会导致不正确的布尔评估? [复制] 【发布时间】:2018-12-30 23:28:14 【问题描述】:

当我遇到一个涉及检查向量大小的奇怪情况时,我正在谦虚地编码。下面列出了该问题的一个独立版本:

#include <iostream>
#include <string>
#include <vector>

int main() 

  std::vector<std::string> cw = "org","app","tag";

  int j = -1;

  int len = cw.size();

  bool a = j>=cw.size();
  bool b = j>=len;


  std::cout<<"cw.size(): "<<cw.size()<<std::endl;
  std::cout<<"len: "<<len<<std::endl;

  std::cout<<a<<std::endl;
  std::cout<<b<<std::endl;

  return 0;

同时使用 g++ 和 clang++(使用 -std=c++11 标志)编译并运行会产生以下输出:

cw.size(): 3
len: 3
1
0

为什么j &gt;= cw.size() 评估为真?稍微试验一下 j 的任何负值都会导致这种奇怪的差异。

【问题讨论】:

阅读integral conversions。请注意,cw.zize() 返回一个无符号类型。 cw.size() 未签名。在比较中,j 的负值被强制转换为一个非常大的正值。 启用附加警告(-Wall -Wextra 用于 gcc/clang),编译器可能会警告您此类内容。 这些 cmets 应该是答案 啊,绝对应该按照@user10605163 的建议发出警告,指出我的问题所在。 【参考方案1】:

这里的缺陷是有符号整数转换,当您将有符号整数值与无符号整数值进行比较时会出现这种转换。在这种情况下,有符号值将被转换为无符号值,如果值为负数,则会得到UINT_MAX - val + 1。所以-1在比较之前会被转换成一个很大的数字。

但是,当您将无符号值分配给有符号值时,例如int len = vec.size(),那么无符号值将变为有符号值,例如,(unsigned)10 将得到 (signed)10。并且两个有符号整数之间的比较不会转换两个操作数中的任何一个,并且会按预期工作。

你可以很容易地模拟这个:

int main() 
    int j = -1;

    bool a = j >= (unsigned int)10; // signed >= unsigned; will convert j to unsigned int, yielding 4294967295
    bool b = j >= (signed int)10; // signed >= signed; will not convert j

    cout << a << endl << b << endl;

    unsigned int j_unsigned = j;
    cout << "unsigned_j: " << j_unsigned << endl;

输出:

1
0
unsigned_j: 4294967295

【讨论】:

为啥使用 STL std::vector 作为 __block 变量会导致内存损坏?

】为啥使用STLstd::vector作为__block变量会导致内存损坏?【英文标题】:WhydoesusinganSTLstd::vectorasa__blockvariablecausememorycorruption?为什么使用STLstd::vector作为__block变量会导致内存损坏?【发布时间】:2013-04-0721:42:51【问题描述】:经过... 查看详情

为啥这个带有布尔变量的函数不起作用?

】为啥这个带有布尔变量的函数不起作用?【英文标题】:Whydoesn\'tthisfunctionwithbooleanvariablework?为什么这个带有布尔变量的函数不起作用?【发布时间】:2018-05-2111:28:45【问题描述】:我编写了简单的代码来在单击按钮后显示/隐... 查看详情

为啥这个方法调用不明确?

】为啥这个方法调用不明确?【英文标题】:Whyisthismethodinvocationambiguous?为什么这个方法调用不明确?【发布时间】:2019-11-1822:26:22【问题描述】:为什么下面对Foo的第一次调用会编译,而第二次调用会导致模棱两可的调用编译... 查看详情

页面项目的布尔评估不正确

】页面项目的布尔评估不正确【英文标题】:Booleanevaluationofpageitemisincorrect【发布时间】:2012-11-2219:13:19【问题描述】:我在APEX页面中有一份报告,它有多个列,其中包含10,000到1,000,000(1M)条记录之间的任何结果(行数)。我有... 查看详情

使用 insert into ... select 会导致 select 附近的语法不正确,为啥?

】使用insertinto...select会导致select附近的语法不正确,为啥?【英文标题】:Usinginsertinto...selectresultsinaincorrectsyntaxnearselect,why?使用insertinto...select会导致select附近的语法不正确,为什么?【发布时间】:2011-06-0616:12:46【问题描述】... 查看详情

为啥这段代码会导致访问不正确? [关闭]

】为啥这段代码会导致访问不正确?[关闭]【英文标题】:Whyisthiscoderesultinginbadaccess?[closed]为什么这段代码会导致访问不正确?[关闭]【发布时间】:2018-10-1411:03:59【问题描述】:WildcardFileFilterwavFiles=WildcardFileFilter("*.wav","","wavFile... 查看详情

为啥这个字谜函数不正确?

】为啥这个字谜函数不正确?【英文标题】:Whyisthisanagramfunctionnotcorrect?为什么这个字谜函数不正确?【发布时间】:2017-12-3005:06:51【问题描述】:刚拿回我的Javascript课程测试,我错过了一个我非常确定的问题。我们应该创建一... 查看详情

为啥这个函数调用的执行时间会发生变化?

】为啥这个函数调用的执行时间会发生变化?【英文标题】:Whyistheexecutiontimeofthisfunctioncallchanging?为什么这个函数调用的执行时间会发生变化?【发布时间】:2020-10-2313:19:23【问题描述】:前言此问题似乎只影响Chrome/V8,在Firefo... 查看详情

Torch JIT Trace = TracerWarning:将张量转换为 Python 布尔值可能会导致跟踪不正确

】TorchJITTrace=TracerWarning:将张量转换为Python布尔值可能会导致跟踪不正确【英文标题】:TorchJITTrace=TracerWarning:ConvertingatensortoaPythonbooleanmightcausethetracetobeincorrect【发布时间】:2021-06-1902:42:54【问题描述】:我正在关注本教程:http... 查看详情

为啥 C# 'is' 运算符在比较两个布尔值时会给出正确的结果,我应该使用它吗?

】为啥C#\\\'is\\\'运算符在比较两个布尔值时会给出正确的结果,我应该使用它吗?【英文标题】:WhydoestheC#\'is\'operatorgiveacorrectresultwhencomparingtwobooleanvaluesandshouldIuseit?为什么C#\'is\'运算符在比较两个布尔值时会给出正确的结果,... 查看详情

为啥这个函数调用后数组会改变? [复制]

】为啥这个函数调用后数组会改变?[复制]【英文标题】:Whyisthearraychangedafterthisfunctioncall?[duplicate]为什么这个函数调用后数组会改变?[复制]【发布时间】:2017-04-3005:04:47【问题描述】:在下面的程序中,数组x的第一个元素的... 查看详情

为啥这个 Python Haversine 公式会产生不正确的答案?

】为啥这个PythonHaversine公式会产生不正确的答案?【英文标题】:WhyisthisPythonHaversineformulaproducingincorrectanswers?为什么这个PythonHaversine公式会产生不正确的答案?【发布时间】:2017-07-2013:25:00【问题描述】:我在堆栈溢出时发现了... 查看详情

为啥将调用函数提前 1 个字节会导致它发生故障?修改啥来解决?

】为啥将调用函数提前1个字节会导致它发生故障?修改啥来解决?【英文标题】:Whydoesmovingacallfunction1byteearliercausesittomalfunction?Whattomodifytoresolveit?为什么将调用函数提前1个字节会导致它发生故障?修改什么来解决?【发布时间... 查看详情

unity中协程函数没有错误为啥会报错

在Unity中使用协程函数时,有时候即使协程函数本身没有错误,也会报错,这可能是因为以下原因之一:1.协程函数的调用方式不正确。在Unity中,协程函数必须使用StartCoroutine函数来启动,如果没有使用该函数,就会出现错误。... 查看详情

评估字符串的布尔函数

...采用balancedternary形式,表示数字为-1、0或1均有效。所以这个函数的重点是检查字符串以确保它是有效的。例如,如果用户输入“-101-11”,布尔函数将返回true。或者如果用户输入“-1012”,布尔函数将返 查看详情

当逻辑条件意味着不应评估输出时,为啥在这个嵌套的 if_else 中会出现 dplyr 错误?

】当逻辑条件意味着不应评估输出时,为啥在这个嵌套的if_else中会出现dplyr错误?【英文标题】:Whydoesdplyrerrorinthisnestedif_else,whenlogicalconditionmeansoutputshouldnotbeevaluated?当逻辑条件意味着不应评估输出时,为什么在这个嵌套的if_else... 查看详情

为啥这个 Prolog Fibonacci 函数会导致“instantiation_error”?

】为啥这个PrologFibonacci函数会导致“instantiation_error”?【英文标题】:WhydoesthisPrologFibonaccifunctioncausea"instantiation_error"?为什么这个PrologFibonacci函数会导致“instantiation_error”?【发布时间】:2012-12-1021:28:35【问题描述】:... 查看详情

为啥 TypeScript 4 转译器没有看到这个不正确的类型传递给函数?

】为啥TypeScript4转译器没有看到这个不正确的类型传递给函数?【英文标题】:WhydidTypeScript4transpilernotseethisincorrecttypepassedtofunction?为什么TypeScript4转译器没有看到这个不正确的类型传递给函数?【发布时间】:2021-08-0715:32:56【问... 查看详情