奇怪的宏行为

Strange macro behaviour

这是我的一段源代码:

for(j=0; j<n-1; j++) {
    printf("(%d %d)->(%d) {%1.9lf < %1.9lf }\n", j+1, j, j + n*(j+1), A[j + n*(j+1)], epsilon*norm);
    printf("(%d %d)->(%d) {%1.9lf < %1.9lf }\n", j+1, j, idx(n, j+1, j), A[idx(n, j+1, j)], epsilon*norm);
    if(A[idx(n,j+1,j)] < epsilon*norm) {
        A[idx(n,j+1,j)] = 0;
    }
  }

这是我的 idx 宏:

#define idx(__n__, __i__, __j__) __j__ + __n__*(__i__)

在我看来,第 2、3 行代码必须产生相同的输出,但事实并非如此。相反,我得到了这样的输出(n 等于 5):

(1 0)->(5) {5.393394651 < 0.000000000 }
(1 0)->(1) {6.171880741 < 0.000000000 }
(2 1)->(11) {2.966791392 < 0.000000000 }
(2 1)->(7) {2.850418342 < 0.000000000 }
(3 2)->(17) {3.370025863 < 0.000000000 }
(3 2)->(13) {4.128639694 < 0.000000000 }
(4 3)->(23) {0.290962836 < 0.000000000 }
(4 3)->(19) {0.147772573 < 0.000000000 }

我尝试 运行 带有标志 E 的 gcc 来查看预处理器对代码做了什么,但我看到了相同的代码行。

for(j=0; j<n-1; j++) {
    printf("(%d %d)->(%d) {%1.9lf < %1.9lf }\n", j+1, j, j + n*(j+1), A[j + n*(j+1)], epsilon*norm);
    printf("(%d %d)->(%d) {%1.9lf < %1.9lf }\n", j+1, j, j + n*(j+1), A[j + n*(j+1)], epsilon*norm);
    if(A[j + n*(j+1)] < epsilon*norm) {
        A[j + n*(j+1)] = 0;
    }
}

有什么问题吗?

您的宏没有正确地括起扩展中的参数:

#define idx(__n__, __i__, __j__) __j__ + __n__*(__i__)

应该是:

#define idx(n, i, j) ((j) + (n) * (i))

除非你真的有什么疯狂的意思。

这是一个错误,但不会导致您的问题。尝试将 doubleprintf 格式修复为 %f 而不是 %lf。还要验证jnAepsilonnorm的类型是否与printf格式一致。