将 C 语句转换为 Java (Array[][] != 0)

Converting C statement in to Java (Array[][] != 0)

提问人:vasimmahmood 提问时间:11/9/2017 最后编辑:Jean-François Fabrevasimmahmood 更新时间:11/9/2017 访问量:61

问:

我正在将一些 C 代码更改为 Java,但我遇到了一种我以前从未见过的语句语法,我不知道它是什么意思。

for (unsigned int i = 0; i < SIZE; i++)
{
    count[2 * SIZE + 1] += grid[i][SIZE - 1 - i] != 0;
}

添加两个数组的元素时,我从未见过“!= 0”在它之后出现。你知道这句话在做什么吗?我在网上找不到任何参考资料。 任何帮助都是值得赞赏的。

Java C 数组相

评论


答:

2赞 Alex Lop. 11/9/2017 #1

grid[i][SIZE - 1 - i] != 0是一个布尔表达式,如果表达式为 ,则(根据 C 标准)计算为 ,否则。1true0

同样的事情可以写成这样:

for (unsigned int i = 0; i < SIZE; i++)
{
    if ( grid[i][SIZE - 1 - i] != 0)
    {
        count[2 * SIZE + 1] += 1;
    }
}

评论

0赞 vasimmahmood 11/9/2017
啊。明白了。我只是从未见过通常的“if 语句/开关大小写/三元运算符之外的条件检查。谢谢。
0赞 Michael Hoff 11/9/2017
好吧,准确地说,不是条件检查,而是一个布尔表达式。您可以使用结果值根据此条件更改控制流,但也可以将其原始值用作数字。!=
0赞 molbdnilo 11/9/2017 #2

布尔值可以隐式转换为整数。

它相当于

 (grid[i][SIZE - 1 - i] != 0) ? 1 : 0

也就是说,如果条件为 true,则加 1,否则加 0。

1赞 Jean-François Fabre 11/9/2017 #3

与 C/C++ 不同,在 Java 中,此测试的结果是布尔值而不是整数 (0/1),并且您不能添加布尔值,因此它计为 0 或 1 为 。falsetrue

我建议进行一个简单的测试,避免将 0 添加到无用处。所以可能更快(好吧,恒定分支可能会使它更慢,必须被板凳)和不那么神秘(这是事实),并且在 C、C++ 或 Java 中有效:count

if (grid[i][SIZE - 1 - i] != 0)
{
    count[2 * SIZE + 1]++;
}

评论

1赞 John Bollinger 11/9/2017
在现代 CPU 上,此版本可能并不比使用三元表达式在每次迭代中无条件添加 0 或 1 的版本快。事实上,它很有可能变慢,特别是如果元素不遵循规则模式。 尽管有优化,但当 CPU 不必处理分支错误预测时,它们往往会做得更好,而首先不进行分支是实现这一目标的好方法。但是,当然,性能很难预测,应该在重要的地方进行测试。gridjavacJIT
0赞 Jean-François Fabre 11/9/2017
是的,分支预测是要考虑的,每个优化都需要大规模的基准测试,以检查它是否适得其反。