【问题标题】:Meaning of int n != unsigned int(n)int n != unsigned int(n) 的含义
【发布时间】:2019-05-02 13:39:33
【问题描述】:

我正在阅读一个代码段,它检查 ppm 文件中的某些值是否正确。这些值是这样读取的:

image >> img_format >> width >> height >> maxval;

然后检查宽度和高度是否正确:

if (width != unsigned int(width) && height != unsigned int(height))
{
    cerr << "Width and/or height of the image are missing." << endl;
    exit(EXIT_FAILURE);
}

**widthheight 被声明为 unsigned int

这种情况如何运作?

【问题讨论】:

  • 除非您说明如何声明 widthheight,否则此问题并不完整。
  • 我想if ( width &lt; 0 ) 还不够晦涩难懂?有趣的是,它似乎是一种非法语法:stackoverflow.com/questions/40765232/…
  • 鉴于编辑“widthheight 被声明为 unsigned int”,对 unsigned int 的可疑函数转换似乎完全没有意义。这段代码的完整上下文和历史可能与这里发生的事情高度相关,因为看起来有人可能一直在试图验证输入。
  • 来自stackoverflow.com/questions/2711522/… 即使语法是正确的,也不能保证如果它是负数就会不同。
  • “这种情况如何运作?”的答案是“它没有”,但我怀疑完整的答案需要包括原因。

标签: c++ file c++11 ppm


【解决方案1】:

Unsigned int 表示数字为 0 或任何正数。在您的情况下,它正在检查变量宽度和高度是否为 0 或某个正整数。

旁注:Size_t 是另一种表示无符号整数的数据类型。

【讨论】:

    【解决方案2】:

    首先unsigned int(width) 是非法语法。也许编译器有一个扩展允许它(我已经检查了 clang 和 gcc 并且都不允许它,即使使用gnu++)。有一些方法可以正确编写此演员表:

    (unsigned int)(width)
    unsigned(width)
    static_cast<unsigned int>(width)
    static_cast<unsigned(width)
    

    推荐static_casts。

    现在假设上面写你的条件的方式之一它什么都不做。你的方式 witdthheightunsigned int 类型,所以演员表完全没有做任何事情,因此比较相当于:

    width != width
    

    这永远是假的。

    所以这是一个错误。


    判断读流操作是否成功的正确方法是:

    if (!(image >> img_format >> width >> height >> maxval))
        // error
    

    或同等的:

    image >> img_format >> width >> height >> maxval;
    
    if (!image)
        // error
    

    【讨论】:

    • 我发现width/height以前不是unsigned,而不是“写它的人不知道他/她在做什么”,而这段代码没有更新。另一个不使用此类“技巧”的原因,因为它们往往会被掩埋。
    • @LightnessRacesinOrbit 好点。我的假设很糟糕。
    • @LightnessRacesinOrbit 但即使widthint,那么比较也是一个常数。我们不知道发生了什么,所以假设它是一个错误,就这样吧。
    • 我想我的意思是......因为我们不知道发生了什么也许我们应该将诽谤降至最低:)
    • @AndrewHenle:啊,标准说行为与strtoull 相同,that 由 C 标准的规则定义,并说“如果减号符号是输入序列的一部分,从数字序列计算的数值被否定,就像结果类型中的一元减号一样,它应用无符号整数环绕规则。"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多