如果声明没有评估为假?程序给出奇怪的输出。为什么呢?

时间:2015-09-12 01:57:04

标签: c++

我必须编写一个接收无符号输入的程序,并将它们放在一个无符号值数组中。如果输入了一个非无符号值,我会调用一个名为" die"输出错误消息,并终止程序。这是我为输入函数编写的代码:

void input(unsigned a[], unsigned elements){

    cout << "Enter unsigned numbers one at a time, each followed by enter." << endl;

    for (unsigned i = 0; i < elements;i++){
        cout << "[" << i << "]: ";      // outputs each index as user is inputting
        cin >> a[i];

        if ( sizeof(a[i]) != sizeof(unsigned) || a[i]<0 ){
        die("Invalid input. Program will now exit.");
        }   
    }
}

我已经检查过,模具功能可以自行完成其工作。以下是输入char时此代码产生的输出:

Enter unsigned numbers one at a time, each followed by enter.
[0]: d
[1]: [2]: [3]: [4]: [5]: [6]: [7]: [8]: [9]: Press any key to continue . . .

正如您所看到的,die函数永远不会被成功调用,因为它之前的if语句不会被评估为false。此外,我不确定为什么我的程序会为数组中的其余值显示空格。 如果收到的输入不是无符号,我怎么能重写if语句来调用die函数?

2 个答案:

答案 0 :(得分:2)

这是因为您的if()表达式永远不能在数学上评估为真。

我们来看看:

if ( sizeof(a[i]) != sizeof(unsigned) || a[i]<0 ){

让我们将其分解为两部分。第1部分:

a[i]unsigned。因此

sizeof(unsigned) != sizeof(unsigned)

总是假的。

第2部分。因为a[i]是无符号的,所以它永远不会是负数,因此

a[i] < 0

也总是假的。

这就是你的die()永远不会执行的。

答案 1 :(得分:0)

为什么呈现的代码不起作用以前已经回答过,我会尝试对MV94的评论作出如何解决这个问题:

不是直接读取unsigned int变量,而是读取比unsigned int更大的signed变量,并在分配到a [i]之前执行检查。确切的类型选择取决于您的架构(您可以从intmax_t尝试<cstdint>)。当然,这只会再次处理某个范围内的数字,如果用户输入的数字足以超过您的签名类型,则会出现类似的问题。正如之前提到的那样,检查您的输入转换是否成功。

相关问题