Abs()和另一个简单的if语句似乎不起作用
abs() and an alternative simple if statement does not seem to be working
我想检查两个字符串的长度是否相差超过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
, long
或long 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
是实际的长度差值。
相关文章:
- 我的简单if-else语句是如何无法访问的代码
- Insert函数不适用于2 if语句C++
- If语句未被求值C++
- C++嵌套if语句,基本货币交换
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 是否可以使用if constexpr删除控制流语句
- 我似乎对if/else的基本语句有问题:/
- If语句在c++中被忽略
- 比较if语句中的数组值和int值
- 以在Qt中的IF语句中设置时间延迟
- Craps游戏问题,忽略if语句
- c++:定义if语句中的模板
- C++嵌套的 If 语句中,它无法按预期工作
- 如果中的多个语句是否与多个 if 相同?
- C++ If/Else 语句被跳过
- 使用语句if时逻辑的问题
- 如何添加语句if-else
- 如何将语句if(isalpha(c))从c++转换为MIPS ?
- 在if语句if C++中创建对象时出现作用域问题
- if语句-if/else和参数放置C++