我有这个:
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()
变量分配内容以执行输出?
答案 0 :(得分:4)
是 i == 0
是非负面和非正面。但是为了让输出“工作”,您需要将if()
谓词更改为仅如果i
或j
为负数,则返回
#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
都不是。那么您可以查看@jrok使用UB技巧设置{{ 1}}。
但严肃地说,重新考虑你的计划的逻辑。
答案 1 :(得分:4)
这为我输出“工作”。不过,它是形式上未定义的。
#include <climits>
void foo()
{
int i = INT_MIN;
int j = -i;
if ((i >= 0) || (j >= 0))
return;
std::cout << "Worked";
}
int main() { foo(); }
自担风险。
答案 2 :(得分:0)
除了变量之外,您还需要使用一些标志来指示您的变量是否可以使用。
没有办法制作一些正数和负数的整数(除了0,我猜)。
答案 3 :(得分:0)
不,您将找不到i使用此代码生成输出的任何值。永远不会; D
答案 4 :(得分:0)
int是一种基本类型,它只能 存储其范围内的整数值。
0既是非负的也是非正的。但是,没有办法按原样获取输出字符串。
答案 5 :(得分:0)
没有整数非数字。我不完全确定这一点,但是如果你的系统有陷阱整数值,那么使用它们时的行为在标准下是未定义的。
但是,对于大多数机器(使用2s补码算术)。所有整数值都是可比较的,并且没有不相等的数字。一个补码算术具有负零和正零,但是一个特定的零将等于它自己。
答案 6 :(得分:0)
身份-INT_MIN == INT_MIN
是一个“事件”,只发生在2s补码签名算法的(非常流行的)架构上。除非您编写特定代码,否则请不要依赖它。它可以在不同的机器上表现不同。