2016-03-21 3 views
0

Отдых в порядке, но я не понимаю, что происходит в этой части:Можете ли вы объяснить этот фрагмент кода?

для (х = 15; х% I ++ я: ++ K, я < х; x--, я ++)

#include <stdio.h> 
#include <stdlib.h> 
int main() { 
    int x, i = 2, k = 1; 
    for (x = 15; x % i ? ++i : ++k, i < x; x--, i++) { 
     x = -k + i; 
     i++; 
     printf("X = %d, I = %d, K = %d\n", x, i, k); 
    } 

    switch (x) { 
     case 2: printf("Display 2.\n"); 
     case 5: printf("Display 5.\n"); 
     case 0: printf("Display 0.\n"); 
     break; 
     default: printf("Display default\n"); 
    } 
    system("pause"); 
    return 0; 
} 
+1

'x% i? ++ i: ++ k' увеличивает i для неровных x и k для четного x. 'i kamikaze

+1

@kamikaze В целом правильно. Но это немного сложнее, чем потому, что «i» изменяется, и, следовательно, это не просто четное/нечетное состояние. – kaylum

+0

Читайте об условных выражениях.И никогда не пишите такой код, это довольно непроницаемо. –

ответ

3

в общем, цикл имеет следующую структуру:

for (part1; part2; part3) { 
    .... 
} 
  • Часть 1 является утверждение, которое выполняется один раз, перед началом цикла.
  • Часть 2 - это условие, которое вы проверяете на каждой итерации.
  • Часть 3 - инструкция, которая выполняется в конце каждой итерации.

Так вот, часть 2 x%i ? ++i : ++k, i<x ; которая проверяет два условия:

  • x%i ? ++i : ++k. Это короткий способ написать заявление if-else. Это можно записать в виде:

    if (x % i) //equivalent to : if ((x%i) == 1) 
        ++i; 
    else 
        ++k; 
    

Это означает, что i увеличивается, если x можно разделить на i и к увеличивается, если он не может.

  • i < x - это очевидное сравнение.
5

Это идиотский код, но понять это вы просто должны разбить его:

for(x=15 ;     // init x = 15 
    x%i ? ++i : ++k, i<x ; // if x is not a multiple of i then increment i, 
          // otherwise increment k, 
          // and then exit loop if i >= x 
    x--, i++)    // decrement x, increment i 
+0

@LPs: спасибо - исправлено! –

1

Это композиция термального оператора C++, оператора запятой и оператора приращения. Это эквивалентно функция

bool f(int x, int &i, int&k) 
{ 
    if (x%i != 0) 
    { 
     ++i; 
     return i != 0; 
    } 
    else 
    { 
     ++k; 
     return i < x; 
    } 
} 

И for будет теперь

for(x=15 ; f(x, i, k); x--, i++) 
{ 
    x=-k+i; 
    i++; 
    printf("X = %d, I = %d, K = %d\n", x, i, k); 
} 
+0

'Это композиция термального оператора C++, но не' C'? – Michi

0

Это троичный оператор (read about it on wiki)

conditionalStatement ? "returnsThisWhenStatementIsTrue" : "returnsThisWhenStatementIsFalse" 

возвращает ++ я при «х% i "является правдивым и возвращает ++ k в противном случае.

Это все. ;)