在三元运算中设置2个值 - C.

时间:2016-10-17 20:17:31

标签: c if-statement ternary-operator

我在使用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个条件后,是否可以在三元组中设置两个值?

感谢,

5 个答案:

答案 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);

但这不会使任何更好或更容易维护。你应该坚持使用ifelse。它易于阅读,可维护,并且完全按照您应该的方式进行。

答案 2 :(得分:1)

正如@dbush所说,你不能在C中这样做。在C ++中你可以使用各种元组类型,但这超出了问题的范围。

为什么不呢?在Python和许多较新的语言中,逗号运算符将值(松散地说)捆绑在一起,因此可以将它们视为一个单元。这就是Python的作用,以及允许x,y = 1,2 if a else 3,4工作的内容。

但是,在C中,逗号运算符分隔表达式语句,而不是a,b评估a,抛弃结果,评估b,并提供评估b作为逗号结果的结果。在任何时候ab都不能一起考虑。

(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 };