-2

我有这个:

void foo()
{
    int i = /*something*/
    int j = -i;

    if ((i >= 0) || (j >= 0))
        return;

    std::cout << "Worked";
}

首先,我尝试分配一个std::numeric_limits<int>::quiet_NaN,但它返回一个零。在这里我发现整数值不能是 NaN (这意味着整数总是通过if(i!=i){...}测试)。所以我的问题是:是否可以为i变量分配一些东西foo()来执行输出?

4

7 回答 7

4

假设您的原始标题是正确的

i == 0既非消极又非积极。但是为了获得输出“Worked”,您需要将谓词更改为仅在其中一个或为负if()时才返回ij

#include <iostream>

void foo()
{
    int i = 0;
    int j = -i;

    if ((i >= 0) || !(j >= 0))
        return;

    std::cout << "Worked";
}

int main()
{
    foo();    
}

现场示例

假设你的if()陈述是正确的

您的if((i >= 0) || (j >= 0)) return;陈述既不假定i也不-i否定。然后您可以查看使用 UB 技巧设置的@jrok 答案i = INT_MIN

但说真的,重新考虑程序的逻辑。

于 2013-08-23T11:57:41.440 回答
4

这为我输出“工作”。不过,它正式未定义。

#include <climits>

void foo()
{
    int i = INT_MIN;
    int j = -i;

    if ((i >= 0) || (j >= 0))
        return;

    std::cout << "Worked";
}

int main() { foo(); }

使用后果自负。

于 2013-08-23T12:00:10.157 回答
0

身份-INT_MIN == INT_MIN是一个“事件”,仅发生在(非常流行的)基于 2s 补码有符号算术的架构上。除非您正在编写特定于平台的代码,否则不要依赖它。它可以在不同的机器上表现不同。

于 2013-08-23T12:32:47.150 回答
0

除了变量之外,您还需要使用一些标志来指示您的变量是否可以使用。

没有办法使某个整数同时为正数和负数(我猜是 0 除外)。

于 2013-08-23T11:57:46.257 回答
0

不,您不会为 i 找到任何值来使用此代码生成输出。从不;D

于 2013-08-23T11:58:19.270 回答
0

int 是一种原始类型,它只能在其范围内存储整数值。

0 既非负又非正。但是,无法按原样获取输出字符串。

于 2013-08-23T12:01:37.517 回答
0

没有整数非数字。我对此并不完全确定,但是如果您的系统具有捕获整数值,则使用它们时的行为在标准下是未定义的。

但是,对于大多数机器(使用 2s 补码算法)。所有整数值都是可比较的,并且没有不等于自身的数字。一个人的补码算术有负零和正零,但一个特定的零将等于它自己。

于 2013-08-23T12:02:02.613 回答