我有一个简单的小代码片段令我感到沮丧:
HashSet<long> groupUIDs = new HashSet<long>();
groupUIDs.Add(uid)? unique++ : dupes++;
Run Code Online (Sandbox Code Playgroud)
在编译时,它会生成错误:
只有赋值,调用,递增,递减和新对象表达式才能用作语句
HashSet.Add 记录为返回bool,因此三元(?)运算符应该工作,这看起来像是一种完全合法的方式来跟踪我添加到哈希集的唯一和重复项的数量.
当我将其重新格式化为if-then-else时,它可以正常工作.
任何人都可以解释错误,如果有一种方法可以做一个简单的三元运算符?
根据我的阅读,我发现内置的三元运算符不存在(我很乐意了解它).
我发现以下代码作为替代:
def val():
var = float(raw_input("Age:"))
status = ("Working","Retired")[var>65]
print "You should be:",status
Run Code Online (Sandbox Code Playgroud)
我无法理解这段代码是如何工作的; 任何人都可以解释我实际上代码是如何工作的?我也很想知道为什么三元运算符不存在; 任何关于此的参考或链接都是有用的.
我在Windows Vista上运行Python 2.6.4.
为什么我们不能在C中的三元运算符中使用return关键字,如下所示:sum> 0?返回1:返回0;
我知道三元运算符有一些令人惊讶的限制,但我有点困惑,这无法为我编译:
void foo(bool b)
{
int* ptr = ((b) ? NULL : NULL);
}
Run Code Online (Sandbox Code Playgroud)
显然,这是显示问题所需的最低限度.错误是:
[BCC32 Error] Unit11.cpp(20): E2034 Cannot convert 'int' to 'int *'
Run Code Online (Sandbox Code Playgroud)
编译器是不到100%符合Embarcadero C++ Builder 2010的,因此编译器错误远非不可能......
注意:修改Parens以避免混淆我的意图.
注2:我对自己如何首先得到这个结构感到有些困惑,所以这是我的借口:我在一行上得到了一些编译错误a = b? c : d,其中b,c和d都是复杂的表达式.为了缩小范围,我用s 代替c,以检查是否是罪魁祸首.在这一点上,一切都在手推车里下地狱.dNULLb
c++ conditional-operator null-pointer c++builder-2010 constant-expression
在下面的代码中,我有两个相同的条件赋值操作,一个返回Double类型的对象,第二个返回字符串"Integer".
double d = 24.0;
Number o = (d % 1 == 0) ? new Double(d).intValue() : new Double(d).doubleValue();
String result = (d % 1 == 0) ? "Integer" : "Double";
System.out.println(o.getClass()); // prints "class java.lang.Double"
System.out.println(result); // Integer
Run Code Online (Sandbox Code Playgroud)
为什么完全相同的表达式返回两个不同的东西?
我认为((1 ? (int)1 : (unsigned int)2) > -1)结果是1(true),但实际上它0在Visual Studio 2017中是(假的).
我认为价值(1 ? (int)1 : (unsigned int)2)应该是(int)1,因为1 ?是真的,而且1 > -1是真的.
我不知道为什么这个表达式的最终结果是错误的.
当我尝试转换时((int)(1 ? (int)1 : (unsigned int)2) > -1),它返回1(true).
signed int test = -1;
signed int si = 1;
unsigned int ui = 2;
printf("%d\n", ((1 ? si : ui) > test));
return 0;
Run Code Online (Sandbox Code Playgroud)
我希望输出是1,但实际输出是0.
是否可以像这样的语句使用条件运算符?
(x == y) ? alert("yo!") : alert("meh!");
Run Code Online (Sandbox Code Playgroud)
或者使用它来分配这样的值是否更正确?
z = (x == y) ? "yo!" : "meh!";
Run Code Online (Sandbox Code Playgroud)
如果像声明一样使用它是不正确的,那么可以添加多行代码来执行吗?为多行代码使用ifthen和switch语句更正确吗?
(x == y) ? (alert("yo!"), document.write("woot!")) : (alert("meh!"), document.write("blah!"));
Run Code Online (Sandbox Code Playgroud) 在下面的代码中,我memset()是一个stdbool.h bool值变量123.(也许这是未定义的行为?)然后我将指向此变量的指针传递给受害者函数,该函数尝试使用条件操作来防止意外值.但是,由于某种原因,GCC似乎完全取消了条件操作.
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
void victim(bool* foo)
{
int bar = *foo ? 1 : 0;
printf("%d\n", bar);
}
int main()
{
bool x;
bool *foo = &x;
memset(foo, 123, sizeof(bool));
victim(foo);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
user@host:~$ gcc -Wall -O0 test.c user@host:~$ ./a.out 123
使这个特别恼人的是该victim()函数实际上在库中,如果值大于1则会崩溃.
转载于GCC版本4.8.2-19ubuntu1和4.7.2-5.没有在clang上复制.
我刚看到关于条件运算符的维基百科文章中的这段代码:
Vehicle new_vehicle = arg == 'B' ? bus :
arg == 'A' ? airplane :
arg == 'T' ? train :
arg == 'C' ? car :
arg == 'H' ? horse :
feet;
Run Code Online (Sandbox Code Playgroud)
我已经改变了一点代码,但想法是一样的.您会发现条件运算符的这种使用是否可以接受?它比if- elseconstruct 更简洁,并且使用一个开关肯定会为bug提供一整套新的机会(任何人都会堕落).此外,if- elses并且switch不能用作R值,因此您必须先创建变量,对其进行初始化,然后根据需要进行分配.
我真的很喜欢这个,但我想知道其他人的想法.
但格式化至关重要.
编辑:我还是喜欢这个.但我理解那些说" switch声明是为此做出的"的人.好吧,也许是这样.但是如果条件是返回的函数调用bool怎么办?或者其他一百万件你无法打开的东西.
你开关恋人真的试图说服我,一个巨大的if- else链比较好?是的,不知道如何使用条件运算符的程序员将无法理解这一点.他们应该学习如何使用它.这不是奥术.
今天,我开口满口如下:
$asdf = ((1 OR true) ? "asdf" : "fdsa");
var_dump($asdf); // print "asdf"
$asdf = (1 OR true) ? "asdf" : "fdsa";
var_dump($asdf); // print "asdf"
$asdf = (1 OR true ? "asdf" : "fdsa");
var_dump($asdf); // print true
$asdf = 1 OR true ? "asdf" : "fdsa";
var_dump($asdf); // print 1
Run Code Online (Sandbox Code Playgroud)
好吧,最后一次并不让我感到惊讶,但第三次?谁能解释一下?