我正在尝试做类似以下的事情
<div id="test">
@(
string.IsNullOrEmpty(myString)
? @:
: myString
)
</div>
Run Code Online (Sandbox Code Playgroud)
上面的语法是无效的,我尝试了很多不同的东西,但无法让它工作.
这是一个例子
#include <iostream>
using namespace std;
int main()
{
int x = 0;
cout << (x == 0 ? x++ : x) << endl; //operator in branch
cout << "x=" << x << endl;
cout << (x == 1 || --x == 0 ? 1 : 2) << endl; //operator in condition
cout << "x=" << x << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
0
x=1
1
x=1
Run Code Online (Sandbox Code Playgroud)
我理解输出,但这是不确定的行为?在任何一种情况下,评估顺序是否得到保证?
即使有保证,我也非常清楚使用递增/递减会很快成为可读性的问题.我只是问我看到类似的代码并且立即不确定,因为有很多关于递增/递减运算符的模糊/未定义使用的示例,例如......
C++没有定义评估函数参数的顺序.↪
int nValue = Add(x, ++x);
Run Code Online (Sandbox Code Playgroud)C++语言表示你不能在序列点之间多次修改变量.↪
x …Run Code Online (Sandbox Code Playgroud)我只是在脚下射击,想知道是否有实际的理由让这种情况成为可能.
无论如何,这个问题可以留在未来的脚射手的方便.
假设我们在vb.net中有一个可以为null的值:
Dim i as Integer?
Run Code Online (Sandbox Code Playgroud)
我们希望根据条件为其分配值,并使用三元运算符,因为它非常简洁和东西:
i = If(condition(), Nothing, 42)
Run Code Online (Sandbox Code Playgroud)
也就是说,如果条件是true,则采用可空性,否则采用该值.
射击发生的时间点.没有明显的原因VB编译器决定,对于共同的基类型Nothing和Integer是Integer,在该点它默默地平移语句:
i = If(condition(), 0, 42)
Run Code Online (Sandbox Code Playgroud)
现在,如果您要在C#中执行此操作:
i = (condition()) ? null : 42;
Run Code Online (Sandbox Code Playgroud)
你会立即得到一个编译器错误,说<null>不能很好地混合int.这很棒,因为这次我采用C#方式,我的脚会更健康.为了编译,你必须明确地写:
i = (condition()) ? null : (int?)42;
Run Code Online (Sandbox Code Playgroud)
现在,您可以在VB中执行相同操作并获得正确的null-ness:
i = If(condition(), Nothing, CType(42, Integer?))
Run Code Online (Sandbox Code Playgroud)
但这需要首先拍摄你的脚.没有编译器错误,也没有警告.这是Explicit On和Strict On.
所以我的问题是,为什么?
我应该把它当作编译器错误吗?
或者有人可以解释为什么编译器会以这种方式运行?
我正在浏览一些代码,我发现了一些三元运算符.这段代码是我们使用的库,它应该非常快.
我在想,除了那里的空间,我们还要保存任何东西.
你有什么经历?
可能重复:
Delphi中是否存在或者是否存在条件运算符?
我知道Delphi没有C#中的三元运算符.即?:
那么如何最好地表示这个函数调用?什么是最干净的方法?
如果有任何代码可以使用INSTEAD编写单独的函数,那将是非常好的吗?如果没有,那么最有效和/或最干净的代码表示是什么?
我已经厌倦了PHP对"短三元"的支持,省略了第二个表达式:
// PHP
$foo = 'hello';
$bar = '';
echo $foo ?: 'world'; // hello
echo $bar ?: 'world'; // world
Run Code Online (Sandbox Code Playgroud)
Javascript是否支持这样的语法?我试过?:导致语法错误.我知道布尔短路,但这对我目前正在做的事情是不可行的; 那是:
// Javascript
var data = {
key: value ?: 'default'
};
Run Code Online (Sandbox Code Playgroud)
有什么建议?(我可以将它包装在一个立即调用的匿名函数中,但这看起来很愚蠢)
我非常熟悉Python的三元运算符方法:
value = foo if something else bar
Run Code Online (Sandbox Code Playgroud)
我的问题很简单:没有先前的赋值,无论如何都要if ...从一个返回操作数(... if或else ...)中引用()中被评估的术语?
这里的动机是,有时我使用的表达式if ...正是我想要的三元运算结果; 虽然如此,对于小表达式,重复它没有问题,但对于更长的表达式,它有点令人讨厌.以此为例:
value = info.findNext("b") if info.findNext("b") else "Oompa Loompa"
Run Code Online (Sandbox Code Playgroud) 如何在Elixir中进行类似的条件性单行检查?
if (x > 0) ? x : nil
Run Code Online (Sandbox Code Playgroud)
这是elixir世界中唯一的等价物吗?
if true, do: 1, else: 2
Run Code Online (Sandbox Code Playgroud) 使用条件移动(汇编cmov)来优化?:C中的条件表达式是一种常见的优化.但是,C标准说:
第一个操作数被评估; 在其评估与第二或第三操作数的评估之间存在一个序列点(以评估者为准).仅当第一个操作数不等于0时才评估第二个操作数; 仅当第一个操作数比较等于0时才评估第三个操作数; 结果是第二个或第三个操作数的值(无论哪个被评估),转换为下面描述的类型.110)
例如,以下C代码
#include <stdio.h>
int main() {
int a, b;
scanf("%d %d", &a, &b);
int c= a > b ? a + 1 : 2 + b;
printf("%d", c);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
将生成优化的相关asm代码,如下所示:
call __isoc99_scanf
movl (%rsp), %esi
movl 4(%rsp), %ecx
movl $1, %edi
leal 2(%rcx), %eax
leal 1(%rsi), %edx
cmpl %ecx, %esi
movl $.LC1, %esi
cmovle %eax, %edx
xorl %eax, %eax
call __printf_chk
Run Code Online (Sandbox Code Playgroud)
根据标准,条件表达式将仅评估一个分支.但是这里对两个分支进行了评估,这违反了标准的语义.这是针对C标准的优化吗?或者许多编译器优化是否与语言标准不一致?
c assembly ternary-operator compiler-optimization language-lawyer
在c我可以做的事情:
int minn(int n, int m){
return (n<m)? n:m
}
Run Code Online (Sandbox Code Playgroud)
但是在python中我无法实现相同的目标:
def minn(n,m):
return n if n<m else return m
Run Code Online (Sandbox Code Playgroud)
这给了 Syntax Error
我知道我可以这样做:
def minn(n,m):
return min(n,m)
Run Code Online (Sandbox Code Playgroud)
我的问题是,我不能在python中使用三元运算符.