我已经使用Java几年了,但直到最近我还没有碰到这个结构:
int count = isHere ? getHereCount(index) : getAwayCount(index);
Run Code Online (Sandbox Code Playgroud)
这可能是一个非常简单的问题,但有人可以解释一下吗?我该怎么看?我很确定我知道它是如何工作的.
isHere是真的,getHereCount()被称为,isHere是假getAwayCount()则调用.正确?这个结构叫做什么?
我有一小段关于sizeof三元运算符的运算符的代码:
#include <stdio.h>
#include <stdbool.h>
int main()
{
bool a = true;
printf("%zu\n", sizeof(bool)); // Ok
printf("%zu\n", sizeof(a)); // Ok
printf("%zu\n", sizeof(a ? true : false)); // Why 4?
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出(GCC):
1
1
4 // Why 4?
Run Code Online (Sandbox Code Playgroud)
但在这里,
printf("%zu\n", sizeof(a ? true : false)); // Why 4?
Run Code Online (Sandbox Code Playgroud)
三元运算符返回boolean类型,sizeof bool类型是1C中的字节.
那为什么要sizeof(a ? true : false)输出四个字节?
本周一直在学习bash并陷入困境.
#!/bin/sh
if [ false ]; then
echo "True"
else
echo "False"
fi
Run Code Online (Sandbox Code Playgroud)
这将始终输出True,即使条件似乎表示不是这样.如果我删除括号[]然后它工作,但我不明白为什么.
为什么这会抛出 NullPointerException
public static void main(String[] args) throws Exception {
Boolean b = true ? returnsNull() : false; // NPE on this line.
System.out.println(b);
}
public static Boolean returnsNull() {
return null;
}
Run Code Online (Sandbox Code Playgroud)
虽然这不是
public static void main(String[] args) throws Exception {
Boolean b = true ? null : false;
System.out.println(b); // null
}
Run Code Online (Sandbox Code Playgroud)
?
解决办法是更换的方式false通过Boolean.FALSE,以避免null被拆箱到boolean,可呈现是不可能的.但这不是问题.问题是为什么?JLS中是否有任何引用证实了这种行为,尤其是第二种情况?
java autoboxing boolean nullpointerexception conditional-operator
关于使用问号的两个问题"?" 和打印函数括号内的冒号":"运算符:它们做了什么?此外,是否有人知道他们的标准术语或我可以在哪里找到有关其使用的更多信息?我读过它们与'if''else'语句类似.
int row = 10;
int column;
while (row >= 1)
{
column = 1;
while(column <= 10)
{
System.out.print(row % 2 == 1 ? "<" : "\r>");
++column;
}
--row;
System.out.println();
}
Run Code Online (Sandbox Code Playgroud) 我目前正在学习使用C++ Primer一书的C++,本书的其中一个练习是:
解释以下表达式的作用:
someValue ? ++x, ++y : --x, --y
我们知道什么?我们知道三元运算符的优先级高于逗号运算符.使用二元运算符这很容易理解,但是对于三元运算符,我有点挣扎.使用二元运算符"具有更高的优先级"意味着我们可以使用具有更高优先级的表达式周围的括号,并且它不会更改执行.
对于三元运算符,我会这样做:
(someValue ? ++x, ++y : --x, --y)
Run Code Online (Sandbox Code Playgroud)
有效地产生相同的代码,这无法帮助我理解编译器如何对代码进行分组.
但是,通过使用C++编译器进行测试,我知道表达式编译并且我不知道:运算符本身可以代表什么.所以编译器似乎正确地解释了三元运算符.
然后我以两种方式执行程序:
#include <iostream>
int main()
{
bool someValue = true;
int x = 10, y = 10;
someValue ? ++x, ++y : --x, --y;
std::cout << x << " " << y << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
结果是:
11 10
Run Code Online (Sandbox Code Playgroud)
而另一方面someValue = false它与它打印:
9 9
Run Code Online (Sandbox Code Playgroud)
为什么C++编译器生成的代码只能为三元运算符的真分支递增x,而对于三元的假分支,它会减少x和y?
我甚至把括号括在真正的分支周围,就像这样:
someValue ? …Run Code Online (Sandbox Code Playgroud) c++ conditional-operator operator-precedence language-lawyer
我似乎无法将这个代码的第一部分(+ =)与三元运算符结合起来.
h.className += h.className ? ' error' : 'error'
Run Code Online (Sandbox Code Playgroud)
我认为这段代码的工作方式如下:
h.className = h.className + h.className ? ' error' : 'error'
Run Code Online (Sandbox Code Playgroud)
但这不正确,因为这会在我的控制台中出错.
所以我的问题是我应该如何正确地插入这段代码?
javascript variable-assignment conditional-operator operator-precedence compound-assignment
似乎我有一个问题,如果声明.
{%if fields | length > 0 || trans_fields | length > 0 -%}
Run Code Online (Sandbox Code Playgroud)
错误是:
Unexpected token "punctuation" of value "|" ("name" expected) in
Run Code Online (Sandbox Code Playgroud)
我无法理解为什么这不起作用,就像是因为所有管道都丢失了枝条.
我试过这个:
{% set count1 = fields | length %}
{% set count2 = trans_fields | length %}
{%if count1 > 0 || count2 > 0 -%}
Run Code Online (Sandbox Code Playgroud)
但是如果也失败了.
然后尝试了这个:
{% set count1 = fields | length > 0 %}
{% set count2 = trans_fields | length > 0 %}
{%if count1 || count2 -%}
Run Code Online (Sandbox Code Playgroud)
它仍然不起作用,每次都是同样的错误......
所以...这引出了一个非常简单的问题:Twig是否支持多种条件?
根据此页面中的示例,我在下面提供了工作和非工作代码示例.
工作代码使用if声明:
if (!empty($address['street2'])) echo $address['street2'].'<br />';
Run Code Online (Sandbox Code Playgroud)
使用三元运算符的非工作代码:
$test = (empty($address['street2'])) ? 'Yes <br />' : 'No <br />';
// Also tested this
(empty($address['street2'])) ? 'Yes <br />' : 'No <br />';
Run Code Online (Sandbox Code Playgroud)
更新
在Brian的小费之后,我发现回声$test输出了预期的结果.以下作品就像一个魅力!
echo (empty($storeData['street2'])) ? 'Yes <br />' : 'No <br />';
Run Code Online (Sandbox Code Playgroud) 例如,像这样:
var value = someArray.indexOf(3) !== -1 ? someArray.indexOf(3) : 0
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来写这个?同样,我不是在寻找上面确切问题的答案,只是一个例子,说明何时可能在三元运算符表达式中重复操作数...