我在使用C中的三元运算符设置两个整数时遇到问题。由于大多数问题与多个三元条件有关,我似乎无法找到答案。
然而,我想检查一个条件并相应地设置2个值。
即:
x, y = ( i == 5 ) ? foo, foo + 1 : bar, bar + 1;
到目前为止,我尝试了以下内容,但它似乎无法正常工作。
@maxKnownId =
SELECT MAX(Id) AS maxID
FROM @PrevDayLog;
DECLARE @max int = @maxKnownId;
在检查1个条件后,是否可以在三元组中设置两个值?
感谢,
答案 0 :(得分:3)
这是不可能的。与支持分配给数字列表的python或perl不同,C不支持这种语法。
您需要两个单独的三元操作来执行此操作:
x = (i == 5) ? foo : bar;
y = (i == 5) ? foo + 1 : bar + 1;
如果您只希望条件运行一次(例如,它是函数调用或其他一些昂贵的操作):
int result = (i == 5);
x = result ? foo : bar;
y = result ? foo + 1 : bar + 1;
编辑:
如果你想使用一些有点难看的东西,这会有效:
x = (i == 5) ? (y = foo + 1, foo) : (y = bar + 1, bar);
通过使用逗号运算符,运算符的左侧(在本例中为y
的赋值)并被丢弃,而右侧变为表达式的值,随后将其赋值给{{ 1}}。
请注意," if"并非严格需要括号。部分,但是" else"部分。
然而,这是对语言的滥用。最好坚持使用更具可读性的东西。
答案 1 :(得分:1)
您可以使用以下功能:
void setAndIncrement(int val, int *x, int *y) {
*x = val;
*y = val + 1;
}
....
(i == 5) ? setAndIncrement(foo, &x, &y): setAndIncrement(bar, &x, &y);
但这不会使任何更好或更容易维护。你应该坚持使用if
和else
。它易于阅读,可维护,并且完全按照您应该的方式进行。
答案 2 :(得分:1)
正如@dbush所说,你不能在C中这样做。在C ++中你可以使用各种元组类型,但这超出了问题的范围。
为什么不呢?在Python和许多较新的语言中,逗号运算符将值(松散地说)捆绑在一起,因此可以将它们视为一个单元。这就是Python的作用,以及允许x,y = 1,2 if a else 3,4
工作的内容。
但是,在C中,逗号运算符分隔表达式或语句,而不是值。 a,b
评估a
,抛弃结果,评估b
,并提供评估b
作为逗号结果的结果。在任何时候a
和b
都不能一起考虑。
(C向导和语言律师:为了OP的可读性,我故意忽略左值/右值考虑因素和其他更精细的语义点。是的,你是正确的,完整答案不应该这样做。:))
答案 3 :(得分:1)
虽然我不建议使用单个三元操作,但可以这样做。如果这只是一个挑战,这里有一些解决方案:
y = 1 + (i == 5 ? (x = foo) : (x = bar));
交替:
y = 1 + (x = i == 5 ? foo : bar);
或者更一般:
(i == 5) ? (x = foo, y = foo + 1) : (x = bar, y = bar + 1);
正如您所看到的,所有这些都有些扭曲,而且不太可读。
如果你能写2个陈述,我建议:
x = (i == 5) ? foo : bar;
y = x + 1;
答案 4 :(得分:1)
满足设定两个值的目标的各种方法:
当然第一个是干净且易于阅读。
if ( i == 5 ) {
x = foo;
y = foo + 1;
} else {
x = bar;
y = bar + 1;
}
另一种方法是设置一个对象的N
个字段,并使用C11 复合文字进行分配。这适用于?:
,因为代码正在设置一个对象。
int i = rand(), foo = rand(), bar = rand();
typedef struct {
int x;
int y;
int z;
} xyz_T;
xyz_T xyz = (i == 5) ?
(xyz_T ) { .x = foo, .y = foo + 1, .z = 1 } :
(xyz_T ) { .x = bar, .y = bar + 1, .z = 2 };