提问人:vasimmahmood 提问时间:11/9/2017 最后编辑:Jean-François Fabrevasimmahmood 更新时间:11/9/2017 访问量:61
将 C 语句转换为 Java (Array[][] != 0)
Converting C statement in to Java (Array[][] != 0)
问:
我正在将一些 C 代码更改为 Java,但我遇到了一种我以前从未见过的语句语法,我不知道它是什么意思。
for (unsigned int i = 0; i < SIZE; i++)
{
count[2 * SIZE + 1] += grid[i][SIZE - 1 - i] != 0;
}
添加两个数组的元素时,我从未见过“!= 0”在它之后出现。你知道这句话在做什么吗?我在网上找不到任何参考资料。 任何帮助都是值得赞赏的。
答:
2赞
Alex Lop.
11/9/2017
#1
grid[i][SIZE - 1 - i] != 0
是一个布尔表达式,如果表达式为 ,则(根据 C 标准)计算为 ,否则。1
true
0
同样的事情可以写成这样:
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 为 。false
true
我建议进行一个简单的测试,避免将 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 不必处理分支错误预测时,它们往往会做得更好,而首先不进行分支是实现这一目标的好方法。但是,当然,性能很难预测,应该在重要的地方进行测试。grid
javac
JIT
0赞
Jean-François Fabre
11/9/2017
是的,分支预测是要考虑的,每个优化都需要大规模的基准测试,以检查它是否适得其反。
评论