以下内容:
( a != b ) ? cout<<"not equal" : cout<<"equal";
假设我不在乎它是否相等,我怎么能用cout<<"equal"
代替no-op来使用上述陈述。
答案 0 :(得分:20)
如果真的是三元运算符不需要第二个动作,最好的选择是将它替换为if:
if (a!=b) cout << "not equal";
它的味道会少很多。
答案 1 :(得分:11)
简单:我会将其编码为
if (a != b)
cout << "not equal";
三元运算符要求两个结果属于同一类型。所以你也可以逃脱
(a != b) ? cout << "not equal" : cout;
因为流运算符(&lt;&lt;)只返回ostream引用。在我看来,这是丑陋和不必要的。
答案 2 :(得分:4)
其他答案中唯一缺少的是: 直接在C / C ++中编写“noop”是没有办法的。
另外,执行:(a != b) ? : printf("equal\n");
确实为我编译(gcc 4.2.4中的gcc -ansi)。
答案 3 :(得分:4)
答案 4 :(得分:3)
(void)0;
是noop。使用expr?false:true
形式有很多充分的理由。看看assert()是如何实现的。
因此,在您的示例中,请使用( a != b ) ? (void)0 : cout<<"equal";
答案 5 :(得分:1)
这是非常令人困惑的代码。你可以只写
cond ? cout << "equal" : cout;
但是你不会(不是吗?),因为你已经有了传统的if
。
答案 6 :(得分:1)
我认为这里的问题是运算符:有两个EXPRESSIONS作为参数。 我们说.. a = x? y:z;
按定义表达式必须有一个值...这就是为什么你不能只是“跳过”。
答案 7 :(得分:1)
如果代码的焦点是输出操作而不是条件,那么可以这样做:
cout << (cond ? "not equal" : "");
我怀疑情况并非如此,因为你想在“else”条款中什么也不做。
答案 8 :(得分:1)
在C ++ 11中,您可以编写(如果无效):
somecondition ? foo() : [] {} () ;
所以NOP实际上是一个空的lambda。 除了void,你可以返回任何类型和价值。
这可能看起来有点矫枉过正,但假设你有这个:
somecondition1 ? foo1() :
somecondition2 ? foo2() :
somecondition3 ? foo3() :
flip_out_because_unhandled_condition() ;
现在,如果有人添加了somecondition4,但忘记将其包含在处理代码中,软件将调用flip_out _...函数,从而导致各种不必要的影响。 但也许somecondition4不需要特别注意,只需要忽略它。 那么你可以写:
somecondition1 ? foo1() :
somecondition2 ? foo2() :
somecondition3 ? foo3() :
somecondition4 ? []{}() :
flip_out_because_unhandled_condition() ;
答案 9 :(得分:0)
if (a!=b) cout<<"not equal";
答案 10 :(得分:0)
语法只需要一个表达式。你可以去: (a!= b)?cout&lt;&lt;“not equal”:1;
答案 11 :(得分:0)
两个语句都编译:
( a != b ) ? cout<<"not equal" : NULL;
( a != b ) ? NULL : cout<<"equal";