我正在研究算法的一部分,而且我的大部分知识来自于了解java。我知道这是一个有条件的,但这里的执行顺序究竟是什么/一步一步发生了什么?谢谢!
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);
答案 0 :(得分:2)
相当于:
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++];
}
答案 1 :(得分:1)
您可以将此代码重写为:
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
的一部分答案 2 :(得分:0)
m和n是可能预先设置的变量,是非负整数,x和a是(应该)分配的数组。在[]的情况下,它可能具有一些有意义的内容,并且这些内容以及m和n的值将确定x []被填充或更新的内容。
循环的目的对我来说完全不透明。它的作用:
将i设置为0,将j设置为m,将k设置为0。 从k == 0循环到k ==(n-1)包含
将x [k]设置为以下内容:
- 如果j是n:a [i],则递增i
- 如果j不是n:
- 如果我是m:a [j],则增加j
- 如果我不是米:
- 如果a [j]的值小于a [i]的值:a [j],则增加j
- 如果a [i]的值不小于a [i]的值:a [i],则递增i
当循环完成时,x [0]到x [n-1]将填充a []中的值,基于a的内容以及m和n的值。
答案 3 :(得分:0)
我认为您无法解密此代码:
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;
不同之处在于条件运算符总是会产生一个值,它可能被赋值给一个变量,否则在一个操作中使用,作为参数传递等等。对于{ {1}}语句是等价的,两个语句块需要包含赋值。
最后,嵌套了多个条件运算,以便用另一个条件运算解析if-then
。