Abs()和另一个简单的if语句似乎不起作用

abs() and an alternative simple if statement does not seem to be working

本文关键字:语句 if 不起作用 简单 另一个 Abs      更新时间:2023-10-16

我想检查两个字符串的长度是否相差超过2。这是我写的

#include <cmath>
#include <string>
if (abs(str1.size() - str2.size()) >= 2)
  return false;

编译错误:

1-5.cpp:8:9: error: call to 'abs' is ambiguous
    if (abs(str1.size() - str2.size()) >= 2)
        ^~~
/Applications/Xcode.app/Contents/Develop
        /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/stdlib.h:129:6: note: 
          candidate function
    int      abs(int) __pure2;
             ^
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cstdlib:167:44: note: 
          candidate function
    inline _LIBCPP_INLINE_VISIBILITY long      abs(     long __x) _NOEXCEPT {return  labs(__x);}
                                               ^
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cstdlib:169:44: note: 
          candidate function
    inline _LIBCPP_INLINE_VISIBILITY long long abs(long long __x) _NOEXCEPT {return llabs(__x);}
                                               ^
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:664:1: note: 
          candidate function
    abs(float __lcpp_x) _NOEXCEPT {return fabsf(__lcpp_x);}
    ^
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:668:1: note: 
          candidate function
    abs(double __lcpp_x) _NOEXCEPT {return fabs(__lcpp_x);}
    ^
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:672:1: note: 
          candidate function
    abs(long double __lcpp_x) _NOEXCEPT {return fabsl(__lcpp_x);}
    ^
    1 error generated.

无法解决问题,我将if语句更改为,

if (str1.size() - str2.size() >= 2 || str1.size() - str2.size() <= -2)
  return false;

即使这个语句似乎也不能正确工作。无论我输入什么字符串,if语句总是返回false。

歧义调用1不是真正的问题:std::string::size返回std::size_t,这是一个无符号整数类型,所以:

str1.size() - str2.size()

将永远是正数或零(负值将被算术模数2n"包裹"起来,所以你将得到一个巨大的数字而不是一个负数)。

你需要改变你比较大小的方式:

if (str1.size() > str2.size() + 2 || str2.size() > str1.size() + 2) {
    // Do whatever you want
}

注意:用你给的代码,clang警告你这个(在某种意义上):

警告:取unsigned类型'unsigned long'的绝对值无效[-Wabsolute-value]

1这里对abs有一个模糊的调用,因为std::size_t是无符号的,并且对于无符号整数类型没有abs(为什么你想要总是正的东西的绝对值?),所以你需要从这个无符号整数类型转换为int, longlong long,这使得调用模糊。

类型size_t是无符号的,并且减去两个无符号数也会得到一个无符号数。当与-2比较无符号数时,-2在比较前也被转换为无符号数。

为了解决这个问题,您可以编写ssize_t sizediff = ssize_t(s1.size()) - ssize_t(s2.size()),它使用signed数据类型进行此计算。

由于string::size()返回unsigned整数。对unsigned的任何算术运算都会得到unsigned的值。如果str1的大小小于str2的大小,并且您尝试str1.size()-str2.size(),则它将返回4,294,967,295 - (diff -1)的值。

注意:这里diff是实际的长度差值。