Странное выражение в c ++ - что это значит? - PullRequest
0 голосов
/ 07 октября 2010

Я видел этот код для поиска минорной матрицы:

RegMatrix RegMatrix::Minor(const int row, const int col)const{
  //printf("minor(row=%i, col=%i), rows=%i, cols=%i\n", row, col, rows, cols);
 assert((row >= 0) && (row < numRow) && (col >= 0) && (col < numCol));

 RegMatrix result(numRow-1,numCol-1);

 // copy the content of the matrix to the minor, except the selected
    for (int r = 0; r < (numRow - (row >= numRow)); r++){
  for (int c = 0; c < (numCol - (col > numCol)); c++){
   //printf("r=%i, c=%i, value=%f, rr=%i, cc=%i \n", r, c, p[r-1][c-1], r - (r > row), c - (c > col));
   result.setElement(r - (r > row), c - (c > col),_matrix[r-1][c-1]);
  }
 }
     return result;
}

Это первый раз, когда я сталкиваюсь с такой строкой кода: r <(numRow - (row> = numRow)).

Что это значит?

Ответы [ 7 ]

2 голосов
/ 07 октября 2010

(row >= numRow) - логическое выражение.Если operator>= не был перегружен, он должен получить значение true, если row больше или равно numRow, и false в противном случае.При приведении этого логического значения к целому числу для вычитания, оно станет 1, если истинно, 0 иначе.

1 голос
/ 07 октября 2010

Несколько более ясный способ выразить это может быть:

r < (row >= numRow ? numRow - 1 : numRow)

1 голос
/ 07 октября 2010

(row >= numRow) - логическое выражение, которое при таком использовании преобразуется в int, где true становится 1, а false становится 0

0 голосов
/ 07 октября 2010

Как уже говорили другие, это просто выражение bool, которое преобразуется в int перед вычитанием (это означает: вычитать 1, если row >= numRow).

Но я бы добавил, что это довольно абсурдно. Вы уже заявили, что row < numRow, поэтому row >= numRow будет нарушать предварительные условия для вашей функции. И то же самое происходит для col > numCol в следующей строке.

0 голосов
/ 07 октября 2010

Результатом использования оператора сравнения является либо true из false, которое при использовании в качестве целого числа равно 1 или 0.

r < (numRow - (row >= numRow))

совпадает с

r < (numRow - 1), если (row >= numRow)

, иначе это r < numRow

0 голосов
/ 07 октября 2010

row >= numRow вернет 1, если row больше или равно numRow, в противном случае 0.

Таким образом, строка кода эквивалентна такой функции:

bool foo() { 
    if(row >= numRow)
       return r < numRow - 1;
    else
       return r < numRow;
}
0 голосов
/ 07 октября 2010

row >= numRow вернет логическое значение true или false, и это неявное приведение к целому числу 0 или 1.Так что это в основном то же самое:

r < (numRow - (row >= numRow ? 1 : 0))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...