以下代码在 C 语言中有效/良好实践吗?
int x = 1;
printf(x == 1 ? "%d second elapsed" : "%d seconds elapsed", x);
Run Code Online (Sandbox Code Playgroud)
它编译得很好,所以我认为它很好(也因为它只是 if-else 块的语法糖),但如果有人有一些额外的见解,我将不胜感激,谢谢。
PS,我想 C++ 也是如此?
我正在使用std::moveon编写一些 C++ 代码shared_ptr,并得到了非常奇怪的输出。我简化了我的代码如下
int func(std::shared_ptr<int>&& a) {
return 0;
}
int main() {
std::shared_ptr<int> ptr = std::make_shared<int>(1);
for (int i = 0; i != 10; ++i) {
func(i == 9 ? std::move(ptr) : std::shared_ptr<int>(ptr));
}
if (ptr) {
std::cout << "ptr is not null: " << *ptr << "\n";
} else {
std::cout << "ptr is null\n";
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到了输出
ptr is null
Run Code Online (Sandbox Code Playgroud)
正如我所预期的,我的ptrwill 在最后一个循环中被移动(转换为std::shared_ptr<int>&&),并且由于func从不窃取 中的内存a,所以我的 …
c++ conditional-operator shared-ptr move-constructor move-semantics
为什么两个结果打印出来是一样的?
final list1 = [ "a", "b", "c" ];
final result1 = true ? list1 : list1..removeWhere((e) => e == "a");
print(result1); // prints ["b", "c"]
final list2 = [ "a", "b", "c" ];
final result2 = false ? list2 : list2..removeWhere((e) => e == "a");
print(result2); // prints ["b", "c"]
Run Code Online (Sandbox Code Playgroud)
这种情况仅发生在三元条件下。当在正常的 if-else 中时,这工作得很好。
return
true ? 'a' :
false ? 'b' :
'c';
这应该返回'a',但它不会.它返回'b'.PHP处理条件运算符的不同部分的顺序是否存在错误?
我从这种情况下的多个条件运算符得到了一个好主意吗?它看起来似乎正常工作.
(当然,真实和假是为了示例的目的.在实际代码中,它们分别是评估为真和假的语句.是的,我知道这肯定)
可能重复:
>?=运算符是什么意思?
我找到了这段代码
...
for(k=i+1;k<j;k++) r <?= go(i,k,b)+go(k,j,b);
for(k='A';k<='Z';k++) r <?= 1+go(i,j,k);
...
Run Code Online (Sandbox Code Playgroud)
我对<?=运营商很感兴趣.在我看来,它应该r与运营商右侧的价值进行比较,如果右侧大于r它应该分配右侧的情况r.我想知道这个(和我认为的类似操作符)在哪里定义,我应该怎么做才能使它们与g ++编译器一起使用?
我经常看到并使用如下代码:
var myvar = (1 < 2) ? 3 : 4 ; //if 1 < 2 then myvar = 3, else = 4
Run Code Online (Sandbox Code Playgroud)
但我刚刚看到一个执行代码的代码,就像以下代码的某种替代if(){}else{}:
例:
(1 < 2) ? alert("example1") : alert("example2");
Run Code Online (Sandbox Code Playgroud)
来到我身边的第一个想法是,"哇,这就像6-7个字符更短","无穷无尽的可能性"或"这使我的一天".
我的问题:
现在,我将继续以正常方式使用它,我担心如果我开始使用它来执行代码片段可能无法正常工作.
是否可以使用带有Groovy条件运算符的表达式包含语句?这就是我现在正在做的事情,我希望在一个带有println语句的条件语句中将其分解......
if(!expired){
println 'expired is null'
return true
}
else if( now.after(expired)){
println 'cache has expired'
return true
}
else
return false
Run Code Online (Sandbox Code Playgroud)
转换成单一陈述......
return (!expired) ? true : (now.after(expired)) ? true : false
Run Code Online (Sandbox Code Playgroud)
...想为调试目的做这样的事情......
return (!expired) ? println 'expired is null' true : (now.after(expired)) ? println 'cache has expired' true : false
Run Code Online (Sandbox Code Playgroud) 我不得不分享这个:
在涉及条件运算符的以下微不足道的错误中,我被挂了2天.
这是一个简单的修正,但我想知道:
越野车代码:
std::map<int, some_class> my_map;
int key_ctr = 0;
//...
std::map<int, some_class>::iterator it_next =
key_ctr == 0 ?
it_next = my_map.begin() // BUG!!!
:
it_next = --my_map.end(); // BUG!!!!
// .....
Run Code Online (Sandbox Code Playgroud)
显然,我错误地编写了条件运算符.当我最终发现并纠正这个错误时,Eveyrthing工作完全正常:
正确代码:
std::map<int, some_class> my_map;
int key_ctr = 0;
//...
std::map<int, some_class>::iterator it_next =
key_ctr == 0 ?
my_map.begin() // CORRECTED!
:
--my_map.end(); // CORRECTED!
Run Code Online (Sandbox Code Playgroud)
当我的程序靠近有缺陷的部分时,我的程序就悬挂了 - 好像它处于一个无限循环中.当我用valgrind运行时,我得到了类似的东西
....
==24570== Warning: set address range perms: large range [0x1a7731000, 0x1c5f79000) (defined) …Run Code Online (Sandbox Code Playgroud) c++ valgrind iterator conditional-operator undefined-behavior
我在ItemClass中有两种方法:
public void setValue(String v);
public void setValue(Double v);
Run Code Online (Sandbox Code Playgroud)
我想使用条件运算符来setVAlue在另一个类:
String str = ...
Double dbl = ...
item.setValue((condition) ? str : dbl);
Run Code Online (Sandbox Code Playgroud)
但编译说:
cannot find symbol
symbol : method setValue(java.lang.Object&java.io.Serializable&java.lang.Comparable<? extends java.lang.Object&java.io.Serializable&java.lang.Comparable<?>>)
Run Code Online (Sandbox Code Playgroud)
我认为编译器使用Double和String 最近的公共超类(超级接口)作为条件运算符的类型.但为什么?
class test {
public static void main (String[] args) {
boolean a = false;
boolean b = true;
if (a && a || b) {
System.out.println(true);
}
}
} //--why it always true????o/p is true but why??
Run Code Online (Sandbox Code Playgroud) c++ ×3
java ×2
c ×1
dart ×1
expression ×1
groovy ×1
iterator ×1
javascript ×1
operators ×1
php ×1
shared-ptr ×1
statements ×1
valgrind ×1