小编eff*_*ffe的帖子

GCC默认主要返回值不为零

我有一些C程序没有从main返回任何显式,如下所示:

int main(int argc, char *argv[])
{
  // blah blah
}
Run Code Online (Sandbox Code Playgroud)

如果我使用GCC 4.6.3和以下选项编译它们:

gcc file.c -Wall -Wextra
Run Code Online (Sandbox Code Playgroud)

程序不返回0并给我带来问题,但标准(以及SO上的许多其他答案)说:

如果main函数的返回类型是与int兼容的类型,则从初始调用返回main函数等同于调用exit函数,并将main函数返回的值作为其参数; [10] 到达}终止main函数返回值0.如果返回类型与int不兼容,则未指定返回到主机环境的终止状态.

[10]根据6.2.4,在主要情况下声明的具有自动存储持续时间的物体的寿命将在前一种情况下结束,即使它们在后者中没有.

我的程序返回不同的值,160,15,14 ...垃圾?

我错过了什么吗?这是GCC的错误吗?在GCC在线文档中找不到任何内容.GCC是否仍然指的是一些旧的C标准(前C99),这可能没有指定?

c gcc

10
推荐指数
1
解决办法
1767
查看次数

SecureRandom自播种

我发现了很多关于这个SecureRandom类的例子:

Random random = new SecureRandom();
int randomInteger = random.nextInt();
Run Code Online (Sandbox Code Playgroud)

或者像这样:

try
{
    Random random = SecureRandom.getInstance("SHA1PRNG");
    int randomInteger = random.nextInt();
}
catch (NoSuchAlgorithmException exception)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

或类似的东西.

然而,无论是SecureRandom()SecureRandom.getInstance(String)有这部分的文档:

返回的SecureRandom对象尚未播种.要为返回的对象设定种子,请调用该setSeed方法.如果setSeed未调用,则第一次调用nextBytes将强制SecureRandom对象自行播种.如果setSeed之前被调用,则不会发生这种自播种.

因此,Random在上面的例子中,对象永远不会在创建时播种.的文件nextInt()(从Random,它不是在覆盖类文件SecureRandom)规定:

该方法nextInt由类实现,Random如下所示:

public int nextInt() {
    return next(32);
}
Run Code Online (Sandbox Code Playgroud)

那么,有没有调用一个nextBytes方法,既不是为了在文档next中方法SecureRandom说,大约播种什么.

我的问题是:上面的Random …

java random

10
推荐指数
1
解决办法
1167
查看次数

浮点运算和机器epsilon

我正在尝试计算该float类型的epsilon值的近似值(我知道它已经在标准库中).

这台机器上的epsilon值是(用一些近似值打印):

 FLT_EPSILON = 1.192093e-07
 DBL_EPSILON = 2.220446e-16
LDBL_EPSILON = 1.084202e-19
Run Code Online (Sandbox Code Playgroud)

FLT_EVAL_METHOD2所以一切都在做long double精度,和float,doublelong double是32,64和96位.

我试图从1开始得到一个近似的值并将其除以2,直到它变得太小,用float类型执行所有操作:

# include <stdio.h>

int main(void)
{
    float floatEps = 1;

    while (1 + floatEps / 2 != 1)
        floatEps /= 2;

    printf("float eps = %e\n", floatEps);
}
Run Code Online (Sandbox Code Playgroud)

输出不是我想要的:

float epsilon = 1.084202e-19
Run Code Online (Sandbox Code Playgroud)

中间操作以最高精度(由于其值FLT_EVAL_METHOD)完成,因此该结果似乎是合法的.

但是,这个:

// 2.0 is a double literal
while ((float) (1 + floatEps / 2.0) != …
Run Code Online (Sandbox Code Playgroud)

c floating-point

6
推荐指数
1
解决办法
1万
查看次数

构造函数调用绑定函数的代理

假设我有一个函数Foo,我希望从它构造的对象具有一个bar属性:

function Foo() {}
Foo.prototype.bar = 'baz'
console.log('new Foo().bar: ' + new Foo().bar)
Run Code Online (Sandbox Code Playgroud)
new Foo().bar: baz
Run Code Online (Sandbox Code Playgroud)

现在假设我以某种方式绑定 Foo.绑定函数仍可用于构造函数调用,并this忽略边界:

const Bound = Foo.bind(42)
console.log('new Bound().bar: ' + new Bound().bar)
Run Code Online (Sandbox Code Playgroud)
new Bound().bar: baz
Run Code Online (Sandbox Code Playgroud)

代理应该是一般的和透明的.然而...

const PFoo = new Proxy(Foo, { })
console.log('new PFoo().bar: ' + new PFoo().bar)

const PBound = new Proxy(Bound, { })
console.log('new PBound().bar: ' + new PBound().bar)
Run Code Online (Sandbox Code Playgroud)
new PFoo().bar: baz
new PBound().bar: undefined
Run Code Online (Sandbox Code Playgroud)

我希望第二个代理的行为完全如此Bound,因为我使用的是空处理程序.换句话说,我希望最后的输出是baz.

为什么不是这样?

(完整的片段如下) …

javascript constructor prototype node.js proxy-pattern

6
推荐指数
1
解决办法
246
查看次数