-1

我正在尝试查看 4x4 矩阵是否是对称的,以下是我目前所拥有的。编译后我收到消息:

pExam3p2.c:12:13: warning: expression result unused [-Wunused-value]  
                                if (Num[r,c]==Num[c,r]){  
                                        ^
pExam3p2.c:12:23: warning: expression result unused [-Wunused-value]
                                if (Num[r,c]==Num[c,r]).

我认为添加一个 else 语句可以解决这个问题。但事实并非如此。非常感谢任何想法。谢谢!

#include <stdio.h>
char isSymm (int Num[][4], int rows, int cols){
    int r,c, count=0;

    for (r=0; r<rows; r++){
        for (c=0; c<cols; c++){
            if (Num[r,c]==Num[c,r]){
                count=count+1;
            }
            else{
                count=count;
            }
        }
    }
    if (count==16){
        return 'y';
    }
    else {
        return 'n';
    }
}

int main (void){
    int Num[4][4];
    int c;
    int r;
    int size =4;

    for (r=0;r<size; r++){
        for (c=0; c<size; c++){
            printf("Enter your number: ");
            scanf("%d", &Num[r][c]); //NOTE THE &...
        }
    }

    char result= isSymm(Num, 4, 4);
    printf("%c", result);
}
4

5 回答 5

2

Num不是“多维”数组(C 没有这些),它是数组数组。因此,要获得其中的一个元素,您需要执行例如Num[r][c].

要解释发生了什么Num[r,c]您需要了解逗号运算符

逗号运算符计算两个子表达式,并丢弃左侧表达式的结果,结果是右侧表达式的结果。因此,r,crandc进行评估,然后r丢弃 的结果,结果为r,cis c

那说明你的表情Num[r,c]是真的Num[c]。AndNum[c]是一个数组,它衰减为指向其第一个元素的指针,即&Num[c][0],然后您比较这两个指针。


在一个无关的注释上,

else{
    count=count;
}

实际上毫无价值,您可以将其完全删除。

于 2018-06-04T06:27:35.560 回答
2

为了访问数组数组,请使用

Num[r][c]

您使用的,运算符确实评估了之前的部分,,但忽略了结果。运算符的结果是第二个计算表达式的值,即,.
这就是为什么编译器会告诉你它r被忽略了。

于 2018-06-04T06:27:48.387 回答
0

更改(Num[r,c]==Num[c,r])(Num[r][c]==Num[c][r])

同时删除 else 语句。

else{
    count=count;
}
于 2018-06-04T06:35:26.467 回答
0

二维数组中的元素是通过数组的下标即row indexcolumn index来访问的。例如 :-

int val = a[2][3];

上面的语句将从数组的第 3 行中获取第 4 个元素。

因此,在您的功能char isSymm (int Num[][4], int rows, int cols)中需要进行一些更改:-

char isSymm (int Num[][4], int rows, int cols){
    int r,c, count=0;

    for (r=0; r<rows; r++){
        for (c=0; c<cols; c++){
            if (Num[r][c]==Num[c][r]){        // not  Num[r,c]==Num[c,r]
                count=count+1;
            }                                 // not needed count=count; else statement.
        }
    }
    if (count==16){
        return 'y';
    }
    else {
        return 'n';
    }
}

计算comma-operator两个子表达式,并丢弃左侧表达式的结果,结果是右侧表达式的结果。因此,对于 r,c , r 和 c 都被评估,然后 r 的结果被丢弃,结果r,cc.Here 它变为Num[c]which is invalid 因为Num二维数组。

于 2018-06-04T06:49:17.390 回答
0

problametic 声明是Num[r,c]==Num[c,r]&为什么它是这样,当你运行时它由编译器gcc -Wall -Wstrict-prototypes -Werror test.c通知

错误:逗号表达式的左侧操作数无效 [-Werror=unused-value]

在and和逗号运算符之间Num[r,c]逗号运算符属性是它会解决所有参数,但只考虑右手操作数,所以结果是现在你正在比较指针,这不会产生正确的结果。rcNum[r,c]Num[c]Num[c]Num[r]

您想检查矩阵是否symmetric为此

Num[r,c]==Num[c,r]==>Num[r][c] == Num[c][r]

因为Num是对称矩阵。您应该计算 number ofrows以便它适用于任何数组,而不是像size=4.

size=4;==> size = sizeof(Num)/sizeof(Num[0]);

并且在比较时Num[r][c]Num[c][r]else部分无用,最好将其删除。

else{ /* not needed as if if block is false count value doesn't need to change */
    count=count;
}
于 2018-06-04T06:54:27.350 回答