我有两个集合,以及根据是否满足某些条件而添加到这些集合中的一个或另一个集合的项目.
有点无意中,我偶然发现写作是合法的
(test(foo) ? cOne : cTheOther).add(foo);
Run Code Online (Sandbox Code Playgroud)
代替
if (test(foo)) {
cOne.add(foo);
} else {
cTheOther.add(foo);
}
Run Code Online (Sandbox Code Playgroud)
虽然第一个让我觉得聪明(总是加分),但我不确定长期可读性,可维护性等.我看到的基本优势是,如果我知道我总是会做同样的事情,它成为改变方法的一个位置(而不是两个,或者如果我通过条件运算符实现switch语句,可能很多).主要的缺点发生在不是这种情况时(即,我需要为某些情况而不是其他情况添加方法调用).
您看到两种方法(或其他解决方案)的优缺点是什么?
如果你不认为使用条件运算符设置哪个对象来调用方法的特定实例是正确的选择,是否存在合理的情况?
为什么这句话:
int a = 7, b = 8, c = 0;
c = b>a?a>b?a++:b++:a++?b++:a--;
cout << c;
Run Code Online (Sandbox Code Playgroud)
不等于:
int a = 7, b = 8, c = 0;
c = (b>a?(a>b?a++:b++):a++)?b++:a--;
cout << c;
Run Code Online (Sandbox Code Playgroud)
并且等于:
int a = 7, b = 8, c = 0;
c = b>a?(a>b?a++:b++):(a++?b++:a--);
cout << c;
Run Code Online (Sandbox Code Playgroud)
请给我一些理由.为什么?
?:与if/else返回对象相比,可能会导致代码效率降低?
Foo if_else()
{
if (bla)
return Foo();
else
return something_convertible_to_Foo;
}
Run Code Online (Sandbox Code Playgroud)
如果bla为false,则返回Foo直接构造自something_convertible_to_Foo.
Foo question_mark_colon()
{
return (bla) ? Foo() : something_convertible_to_Foo;
}
Run Code Online (Sandbox Code Playgroud)
这里,returnis 之后的表达式的类型Foo,所以我猜先Foo创建一些临时的,如果bla是false则产生表达式的结果,然后临时必须被复制构造以返回函数的结果.那分析听起来不错?
c++ constructor ternary-operator return-value conditional-operator
给出以下表达式:
$att['menutext'] = isset($attrib_in['i_menu_text']) ? : $this->getID();
Run Code Online (Sandbox Code Playgroud)
如果它的计算结果为true,则会$att['menutext']设置为true或$this->getID()?
在Python中玩,我发现以下代码按预期工作:
f = lambda S,b : (S if len(S)==b else f(S[1:],b))
Run Code Online (Sandbox Code Playgroud)
从列表S中,它将递归地删除第一个元素,直到S的长度等于b.例如f([1,2,3,4,5,6],3)= [4,5,6].
然而,令我惊讶的是,以下解决方案使用'三元黑客'[a,b] [c]而不是"b if c else a"(又名"c?b:a")不起作用:
g = lambda S,b : (g(S[1:],b),S)[len(S)==b]
Run Code Online (Sandbox Code Playgroud)
这将超过最大递归深度.
为什么这不起作用?
(我知道两者都不是一个很好的编码风格的例子,但现在不是重点.)
C和C++之间存在很多差异,并且卡在其中一个上相同的代码在C中产生错误而在C++中执行正常请解释原因
int main(void)
{
int a=10,b;
a>=5?b=100:b=200;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码在C中给出了一个错误,说明了所需的左值,而相同的代码在C++中编译得很好
许多语言的三元运算符都是这样的:
x = f() ? f() : g()
Run Code Online (Sandbox Code Playgroud)
其中if f()为truthy则x赋值为f(),否则赋值为g().但是,某些语言有一个更简洁的elvis运算符,它在功能上是等价的:
x = f() ?: g()
Run Code Online (Sandbox Code Playgroud)
在python中,三元运算符表达如下:
x = f() if f() else g()
Run Code Online (Sandbox Code Playgroud)
但是python有更简洁的elvis操作符吗?
也许是这样的:
x = f() else g() # Not actually valid python
Run Code Online (Sandbox Code Playgroud) 最近在一段Java代码中看到了这个三元运算语句:
int getVal(Integer number, boolean required) {
Integer val = number == null ? required ? 1 : 2 : 3;
return val;
}
Run Code Online (Sandbox Code Playgroud)
我从未见过像这样连续有两个问号的三元语句(没有任何括号)。如果我使用输入值,我可以1返回 ifnumber == null并3返回,但似乎不需要什么,2永远不会返回。
这个语句是什么意思(即我应该如何将它读作true/false条件的单词语句)以及需要2返回的输入是什么?
代码
#include<iostream>
int main()
{
int a=4,b,c;
a==3 ? : b=a*a ; // Works fine
a==4 ? c=a*a : ; // ERROR Expected Primary expression before ;
}
Run Code Online (Sandbox Code Playgroud)
第一个条件语句
我没有写“表达式 2 ”,但它不会产生错误
第二个条件语句
我没有写“表达式 3 ”,它给出了一个错误
那么为什么它在“表达式 2 ”和“表达式 3 ”中有所区别?
考虑以下无用的代码片段,它在不同的编译器中给出不一致的结果(演示)
\n#include <type_traits>\n\nchar* dummy;\nconst char* const& a = dummy;\n char* & b = dummy;\nusing T = decltype(true ? a : b);\nstatic_assert(std::is_same<const char* const&, T>::value); // pass in Clang and MSVC:c++20\nstatic_assert(std::is_same<const char* , T>::value); // pass in GCC and MSVC:c++17\nRun Code Online (Sandbox Code Playgroud)\nGCC认为T存在const char*于C++的所有版本中,而Clang认为存在const char* const&于所有版本中;MSVC 认为T在const char*C++17 和const char* const&C++20 下。
从语言律师\xe2\x80\x99s的角度来看,我应该相信哪个编译器?
\nc++ ×5
java ×2
python ×2
c ×1
coding-style ×1
constructor ×1
php ×1
recursion ×1
return-value ×1
ternary ×1