C数组中的感叹号(单位矩阵)

时间:2017-02-19 12:34:26

标签: c matrix identity

我知道在C中有一个关于!的解释的帖子,但我完全不理解,所以我们走了。根据我的理解,number!将返回0表示非零数字,1表示0表示我在网上看到了一些代码,并确定矩阵是否是一个单位矩阵,人们使用了以下内容:

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");

用户输入的矩阵大小和值为a矩阵。我的问题是!如何标记帮助以确定它是否是一个单位矩阵,如果能做的就是返回1和0的输入。并且还有其他方法可以在不使用?

的情况下识别单位矩阵

6 个答案:

答案 0 :(得分:2)

! 始终返回一个int(感谢alk指出),在这种情况下它代表逻辑NOT 而且只是补充布尔表达式,如果布尔表达式求值为true,说boolean ex = true!ex将解析为false(最后为0)是true补充

如果进行比较,==用于检查相等性,!=用于检查不等式,这两者都会产生boolean值最终被评估为int

答案 1 :(得分:2)

您的代码不会检查矩阵是否是单位矩阵。你不需要!来找出:你需要做的就是检查所有矩阵元素是否为零,除了在主对角线上,i==j时,在这种情况下元素必须是1

比较i == j返回0或1,因此您需要做的就是检查所有值ij元素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

答案 2 :(得分:1)

C(以及许多其他语言)中的感叹号代表逻辑“不”符号。 ie-&#39;!=&#39;是不等的&#39;。 在C中,特别是非零数字上的NOT将返回0,而0上的NOT将返回1,因为数字也可以用作TRUE或FALSE表示法(0 = FALSE,非零= TRUE)。

希望有所帮助

答案 3 :(得分:1)

!=检查两个操作数的值是否相等。如果值不相等,则条件成立。如果A保持10而B保持20,则(A != B)为真。

答案 4 :(得分:1)

其他答案已经解决了!=意味着不等于,但还有其他事情未被涵盖。

首先:您的代码不会检查身份矩阵

试试这个矩阵:

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

此外,我认为没有任何答案解决了这一部分:

  

还有其他方法可以在不使用?

的情况下识别单位矩阵

是的,您可以在不使用!=的情况下编写它。它可以通过多种方式完成。这只是一个例子:

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

答案 5 :(得分:0)

!和!=是两个不同的运营商。

!被称为NOT运算符。此运算符会反转其操作的表达式的结果。例如,如果表达式求值为非零值,则应用!对它的运算符结果为0.反之亦然,如果表达式求值为零则应用!运算符使它成为1,非零值。申请后的最终结果!运算符0或1分别被认为是假或真。

而!=是一个关系运算符,用于检查应用了!=的两个操作数是否相等。 !=被称为不等于运算符并用于比较两个量。

现在就你的问题

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

在上面的代码片段中,当且仅当[i] [j]不等于1并且[j] [i]不等于0时,条件才为真。如果是,则内部的代码将执行。 在代码中,如果条件为真,它将评估为1,这是真,否则0为false。正如你所说&#34;怎么做!无论如何标记帮助以确定它是否是一个单位矩阵&#34;,它不是!标记它是!=标记帮助识别矩阵是否是标识。

希望这会有所帮助。