如何解释嵌套条件运算符

How to interpret Nested Conditional Operator

我正在研究算法的一部分,我的大部分 c 知识来自 java。我知道这是有条件的,但是 here/what 的执行顺序究竟是什么?谢谢!

    int i, j, k;
    int *x = malloc(n * sizeof (int));
    for (i = 0, j = m, k = 0; k < n; k++) {
        x[k] = j == n      ? a[i++]
             : i == m      ? a[j++]
             : a[j] < a[i] ? a[j++]
             :               a[i++];
    }
    free(x);

相当于:

    for (i = 0, j = m, k = 0; k < n; k++) {
        if (j == n) x[k] = a[i++];
        else if (i == m) x[k] = a[j++];
        else if (a[j] < a[i]) x[k] = a[j++];
        else x[k] = a[i++];
    }

您可以将此代码重写为:

if (j == n)
    x[k] = a[i++];
else if (i == m)
    x[k] = a[j++];
else if (a[j] < a[i])
    x[k] = a[j++];
else
    x[k] = a[i++];

它看起来像 merge sort algorithm

的一部分

m 和 n 是假定事先设置的变量并且是非负整数,而 x 和 a 是(应该)分配的数组。在 a[] 的情况下,它可能有一些有意义的内容,这些内容以及 m 和 n 的值将决定 x[] 被填充或更新的内容。

循环的目的对我来说是完全不透明的。它的作用:

将 i 设置为 0,将 j 设置为 m,将 k 设置为 0。 从 k == 0 循环到 k == (n-1) inclusive

将 x[k] 设置为以下内容:

  • if j is n: a[i], then increments i
  • if j is not n:
    • if i is m: a[j], then increments j
    • if i is not m:
      • if the value at a[j] is less than the value at a[i]: a[j], then increments j
      • if the value at a[i] is not less than the value at a[i]: a[i], then increments i

循环完成后,x[0] 到 x[n-1] 将根据 a[] 的内容以及 m 和 n 的值填充 a[] 中的值。

我假设您在破译这段代码时遇到了问题:

x[k] = j == n      ? a[i++]
     : i == m      ? a[j++]
     : a[j] < a[i] ? a[j++]
     :               a[i++];

假设是这样,这就是条件运算符,正如 vsync 所展示的那样,它与 if-else 语句非常相似。从本质上讲,这个语句应该被认为是:

condition ? valueIfTrue : valueIfFalse;

事实证明,这与以下内容非常相似但又有所不同:

if (condition) 
    statementIfTrue;
else
    statementIfFalse;

不同之处在于,条件运算符总是产生一个值,它可能被分配给一个变量,否则在操作中使用,作为参数传递等。 .. 为了使 if-then 语句等效,两个语句块需要包含赋值。

最后,嵌套了多个条件操作,这样 valueIfFalse 就用另一个条件操作解决了。