如何解释嵌套条件运算符
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
就用另一个条件操作解决了。
我正在研究算法的一部分,我的大部分 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
就用另一个条件操作解决了。