gpt4 book ai didi

c++ - 警告 - 有符号和无符号整数表达式之间的比较

转载 作者:IT老高 更新时间:2023-10-28 13:21:29 30 4
gpt4 key购买 nike

我目前正在研究Accelerated C++,并在练习 2-3 中遇到了一个问题。

程序概览 - 程序基本上采用名称,然后在星号框架内显示问候语 - 即 Hello!被 * 包围。

练习 - 在示例程序中,作者使用 const int 来确定问候语和星号之间的填充(空格)。然后,作为练习的一部分,他们要求读者询问用户他们希望填充多大的输入。

这一切看起来都很简单,我继续向用户询问两个整数(int)并存储它们并更改程序以使用这些整数,在编译时删除作者使用的整数虽然我收到以下警告;

Exercise2-3.cpp:46: warning: comparison between signed and unsigned integer expressions

经过一些研究,这似乎是因为代码尝试将上述整数之一 (int) 与 string::size_type 进行比较,这很好。但我想知道 - 这是否意味着我应该将其中一个整数更改为 unsigned int?明确说明我的整数是有符号还是无符号重要吗?

 cout << "Please enter the size of the frame between top and bottom you would like ";
int padtopbottom;
cin >> padtopbottom;

cout << "Please enter size of the frame from each side you would like: ";
unsigned int padsides;
cin >> padsides;

string::size_type c = 0; // definition of c in the program
if (r == padtopbottom + 1 && c == padsides + 1) { // where the error occurs

上面是相关的代码,cstring::size_type 类型,因为我们不知道问候语可能会持续多长时间 - 但为什么我要现在得到这个问题,当作者的代码使用const int时没有得到这个问题?另外——对于任何可能已经完成Accelerated C++的人——这本书后面会解释吗?

我在 Linux Mint 上通过 Geany 使用 g++,如果这有助于或有所作为(正如我读到的那样,在确定 string::size_type 是什么时它可以)。

最佳答案

如果将变量与大小进行比较,通常最好将变量声明为 unsignedsize_t 以避免此问题。尽可能使用您将要比较的确切类型(例如,在与 std::string 的长度进行比较时使用 std::string::size_type) .

编译器在比较有符号和无符号类型时会发出警告,因为有符号和无符号整数的范围不同,当它们相互比较时,结果可能会令人惊讶。如果您必须进行这样的比较,您应该将其中一个值显式转换为与另一个兼容的类型,也许在检查以确保转换有效之后。例如:

unsigned u = GetSomeUnsignedValue();
int i = GetSomeSignedValue();

if (i >= 0)
{
// i is nonnegative, so it is safe to cast to unsigned value
if ((unsigned)i >= u)
iIsGreaterThanOrEqualToU();
else
iIsLessThanU();
}
else
{
iIsNegative();
}

关于c++ - 警告 - 有符号和无符号整数表达式之间的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3660901/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com