如何解释嵌套条件运算符

时间:2015-11-20 22:16:28

标签: c code-snippets

我正在研究算法的一部分,而且我的大部分知识来自于了解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);

4 个答案:

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

相关问题