2017-02-19 26 views
0

Я знаю, что есть тема об объяснении ! в C, но я не понял его полностью, поэтому здесь мы идем. Из моего понимания number! возвращают 0 для ненулевого числа и 1 для 0. Я видел несколько кода в Интернете и определить, если матрица единичной матрицы люди использовали что-то вдоль линий:Восклицательный знак в массиве C (идентификационная матрица)

for (i = 0; i < row; i++) 
{ 
    for (j = 0; j < column; j++) 
    { 
     if (a[i][j] != 1 && a[j][i] != 0) 
     { 
      flag = 0; 
      break; 
     } 
    } 
} 
if (flag == 1) 
    printf("It is identity matrix \n"); 
else 
    printf("It is not a identity matrix \n"); 

С пользователь вводит размер матрицы и значения с матрицей. Мой вопрос заключается в том, как ! пометка поможет в любом случае определить, является ли это идентификационной матрицей или нет, если все, что она может сделать, это вернуть вход 1 и 0. И будет ли другой способ идентифицировать матрицу идентичности без использования?

+3

Здесь '!' Является частью оператора '! =', Что означает «не равно». Вы, кажется, ошибаетесь в этом для оператора «логического отрицания». –

+0

'a! = B' равнозначно'! (A == b) '. – alk

ответ

1

Восклицательный знак на языке C (и многих других языках) обозначает логический знак NOT. т. е. - '! =' является «НЕ РАВНЫМ». В C специально НЕ на ненулевое число вернет 0, в то время как NOT on 0 вернет 1, потому что числа могут использоваться как TRUE или FALSE-нотации (0 = FALSE, non-zero = TRUE).

Надежда, что помогает

+1

0 - это номер, поэтому «NOT on number» - не очень удачный способ его поместить. Возможно, вы имели в виду «ненулевое число». – unwind

+0

@unwind Довольно верно-исправлено :) – Shtut

1

!= Проверяет значения двух операндов равны или нет. Если значения не равны, то условие становится истинным. (A != B) верно, если А имеет 10 и B имеет 20.

2

!всегда возвращает Int (спасибо alk за указание, что выход), это означает Логическое НЕ в этом случае и только дополняет в логическое выражение, если логическое выражение принимает значение true, скажем boolean ex = true тогда !ex разрешило бы к false (и, наконец, 0), которая является дополнением из true.

В случае сравнения == используются для проверки равенства и != используются для проверки неравенства и оба этого результата в boolean значении, которое, наконец, получает оценку в int.

+0

"*! Не возвращает int, *": Не совсем верно. Из [C11 Standard (draft) 6.5.3.3/5](http://port70.net/~nsz/c/c11/n1570.html#6.5.3.3p5): «* Результат оператора логического отрицания! равно 0, если значение его операнда сравнивается с не равным 0, 1, если значение его операнда сравнивается с 0. ** Результат имеет тип 'int' **. *" (выделение мое) – alk

+0

@alk Вы право, я говорил в контексте! используется для булевых элементов, сделал редактирование. –

+0

Sry, но для подтверждения с помощью приведенного выше стандарта, применяющего '!' -оператор ***, всегда нужно оценивать значение 'int'.Вы можете использовать его на любом скалярном типе. Посмотрите на C '_Bool' как 1-битное целое без знака с рангом ниже любого другого целочисленного типа. – alk

2

Ваш код не проверяет, является ли матрица единичной матрицей или нет. Вы не нуждаетесь в !, чтобы узнать: либо все, что вам нужно сделать, это проверить, что все матричные элементы равны нулю, кроме основной диагонали, когда i==j, и в этом случае элемент должен быть 1.

Сравнение i == j возвращает ноль или один, так что все, что вам нужно сделать, это проверить, что для всех значений i и j элемент a[i][j] равно результату сравнения i==j:

int flag = 1; 
for (i = 0 ; flag && i < row ; i++) { 
    for (j = 0; flag && j < column; j++) { 
     int mainDiagonal = (i==j); 
     flag = a[i][j] == mainDiagonal; 
    } 
} 
if (flag == 1) 
    printf("It is identity matrix \n"); 
else 
    printf("It is not a identity matrix \n"); 

Примечание несколько изменений в петли: поскольку break позволяет вам выйти из одного цикла, я изменил условия продолжения, чтобы проверить flag.

1

Другие ответы уже написали, что != означает не равно, но есть и другие предметы, не охваченные.

Прежде всего: Ваш код не проверяет единичную матрицу

Просто дайте ему попробовать с этой матрицей:

int a[2][2] = {{1, 1}, {1, 1}}; 

Кроме того, я не думаю, что какой-либо ответ на имя этого part:

И будет ли другой способ идентифицировать единицу матрицы без использования?

Да, вы можете написать его без использования !=. И это можно сделать разными способами. Вот только один пример:

flag = 1; 
for (i = 0; i < row; i++) 
{ 
    for (j = 0; j < column; j++) 
    { 
     if (i == j) 
     { 
      if (a[i][j] == 1) continue; 
     } 
     else 
     { 
      if (a[i][j] == 0) continue; 
     } 

     flag = 0; 
    } 
} 
if (flag == 1) 
    printf("It is identity matrix \n"); 
else 
    printf("It is not a identity matrix \n"); 

Не очень хороший код, но это способ сделать это без !=

Для реального прохладного способа проверки для единичной матрицы (без использования !=) увидеть ответ от @dasblinkenlight: https://stackoverflow.com/a/42328490/4386427

0

! и! = - два разных оператора.

! называется NOT Operator. Этот оператор меняет результат выражения, на котором он работает. Например, если выражение оценивает ненулевое значение, то применение! Оператор к нему приводит к 0. Наоборот, если выражение оценивается равным нулю, то при применении! Оператор к нему делает его 1, отличным от нуля. Окончательный результат после применения! оператор будет 0 или 1 считается ложным или истинным соответственно.

Принимая во внимание, что = = реляционный оператор, который используется для проверки того, не являются ли два операнда, на которые применяется значение! =. ! = называется не равным оператору и используется для сравнения двух величин.

Теперь на ваш вопрос

if (a[i][j] != 1 && a[j][i] != 0) 
    { 
     flag = 0; 
     break; 
    } 

В приведенном выше фрагменте кода условие будет истинно тогда и только тогда, когда [я] [J] не равен 1, и [у] [я] не равно 0. Если это так, код внутри if будет выполняться. Здесь, в коде, если условие истинно, оно будет оцениваться как 1, которое является истинным, иначе 0 является ложным. Как вы сказали, «как это сделать, пометьте помощь в любом случае, чтобы определить, является ли она идентификационной матрицей или нет», это не так! mark it! = mark help, чтобы определить, является ли матрица тождественной.

Надеюсь, это поможет.

 Смежные вопросы

  • Нет связанных вопросов^_^