我目前正在使用Accelerated C++,在练习2-3中遇到了一个问题。
对程序的快速概述-程序基本上是取一个名字,然后在星号框内显示一个问候语-即你好!被*包围的。
练习-在示例程序中,作者使用const int
来确定问候语和星号之间的填充(空格)。然后,作为练习的一部分,他们要求读者要求用户输入他们想要的填充有多大。
所有这一切似乎都很简单,我继续向用户索要两个整数(int
)并存储它们,并更改程序以使用这些整数,在编译时删除作者使用的整数,尽管我收到以下警告;
练习2-3.cpp:46:警告:有符号整数表达式与无符号整数表达式的比较
经过一些研究后,这似乎是因为代码试图将上面的一个整数(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
上面是相关的代码片段,c
是string::size_type
类型的,因为我们不知道问候可能有多长-但是为什么我现在遇到这个问题,而作者的代码在使用const int
时没有得到这个问题?此外,对于任何可能已经完成加速C++的人来说,这将在本书的后面部分进行解释吗?
我在Linux Mint上通过Geany使用g++,如果这有帮助或有什么不同的话(因为我读到在确定string::size_type
是什么时可以这样做)。
发布于 2010-09-08 01:09:54
如果要将变量与大小进行比较,通常将变量声明为unsigned
或size_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();
}
发布于 2014-01-08 00:25:52
我昨天在处理Accelerated C++中的问题2-3时遇到了完全相同的问题。关键是要将所有要比较的变量(使用布尔运算符)更改为兼容类型。在本例中,这意味着string::size_type
(或unsigned int
,但由于本例使用的是前者,即使两者在技术上是兼容的,我也将坚持使用前者)。
请注意,在它们的原始代码中,正如您正确地指出的那样,它们正是为c计数器(本书2.5节的第30页)这样做的。
使此示例更加复杂的是,不同的填充变量(padside和padtopbottom)以及所有计数器也必须更改为string::size_type
。
以您的示例为例,您发布的代码最终将如下所示:
cout << "Please enter the size of the frame between top and bottom";
string::size_type padtopbottom;
cin >> padtopbottom;
cout << "Please enter size of the frame from each side you would like: ";
string::size_type padsides;
cin >> padsides;
string::size_type c = 0; // definition of c in the program
if (r == padtopbottom + 1 && c == padsides + 1) { // where the error no longer occurs
请注意,在前面的条件中,如果没有在for
循环中将变量r初始化为string::size_type
,则会出现错误。因此,您需要使用如下内容来初始化for循环:
for (string::size_type r=0; r!=rows; ++r) //If r and rows are string::size_type, no error!
因此,基本上,一旦你在混合中引入了一个string::size_type
变量,任何时候你想要对该项目执行布尔操作,所有的操作数都必须有一个兼容的类型,这样它才能编译而不会出现警告。
发布于 2010-09-08 01:32:33
有符号整数和无符号整数之间的重要区别是对最后一位的解释。有符号类型中的最后一位表示数字的符号,意思是:例如:
0001是有符号的和无符号的1001是有符号的和9是无符号的
(为了解释清楚,我避免了整个补充性问题!这并不是整数在内存中的确切表示方式!)
可以想象,知道与-1或+9进行比较是有区别的。在许多情况下,程序员太懒了,不会将counting声明为unsigned (使for循环头部F.I.膨胀)。这通常不是问题,因为对于整数,您必须数到2^31,直到您的符号位咬到您为止。这就是为什么它只是一个警告。因为我们懒得写“unsigned”而不是“int”。
https://stackoverflow.com/questions/3660901
复制相似问题