只有按位运算符的 C 程序才能正确地使用调试语句

C Program with Bitwise Operators Only Functions Correctly with Debug Statements

我正在尝试解决这个挑战:

任务: 给定集合 S = {1, 2, 3, ...n},找到:

输入格式:唯一一行包含2个space分隔的整数,nk ,分别

我写了这个 C 程序来尝试解决它。​​

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

void calculate_the_maximum(int n, int k) {
    int i, j = 1;
    int maxAND, maxOR, maxXOR = 0;
    int AND, OR, XOR = 0;

    for (i = 1; i <= n; i++) {
        for (j = i + 1; j <= n; j++) {
            AND = (i & j); OR = (i | j); XOR = (i ^ j);
            if (AND > maxAND && AND < k) { maxAND = AND; }
            if (OR > maxOR && OR < k) { maxOR = OR; }
            if (XOR > maxXOR && XOR < k) { maxXOR = XOR; }
        }
    }

    printf("%d\n%d\n%d", maxAND, maxOR, maxXOR);
}

int main() {
    int n, k;

    scanf("%d %d", &n, &k);
    calculate_the_maximum(n, k);

    return 0;
}

在我看来这应该可行,不幸的是,它打印出来了

2
24
3

而不是我预期的

2
3
3

更奇怪的是,有时程序会为 maxAND 打印出一个看似随机的数字,看起来像

1910024400
24
3

这很奇怪:当我每次包含调试语句时,程序都会打印出我期望的结果。 如果我在第 13 行添加这个

printf("I: %d J: %d OR: %d\n", i, j, OR);
,程序现在打印出

I: 1 J: 2 OR: 3
I: 1 J: 3 OR: 3
I: 1 J: 4 OR: 5
I: 1 J: 5 OR: 5
I: 2 J: 3 OR: 3
I: 2 J: 4 OR: 6
I: 2 J: 5 OR: 7
I: 3 J: 4 OR: 7
I: 3 J: 5 OR: 7
I: 4 J: 5 OR: 5
2
3
3

这正是我所期望的。 知道为什么这个程序只输出我期望的包含额外 printf 的内容吗?

你的 max 变量在循环开始之前没有初始化。应该是:

void calculate_the_maximum(int n, int k) {
    int i, j = 1;
    int maxAND = 0, maxOR = 0, maxXOR = 0;
    int AND, OR, XOR = 0;

    for (i = 1; i <= n; i++) {
        for (j = i + 1; j <= n; j++) {
            AND = (i & j); OR = (i | j); XOR = (i ^ j);
            if (AND > maxAND && AND < k) { maxAND = AND; }
            if (OR > maxOR && OR < k) { maxOR = OR; }
            if (XOR > maxXOR && XOR < k) { maxXOR = XOR; }
        }
    }

    printf("%d\n%d\n%d", maxAND, maxOR, maxXOR);
}

在你定义的变量中

int maxAND, maxOR, maxXOR = 0;

您仅使用 0 初始化了 maxXOR,但 maxANDmaxOR 仍未初始化。稍后访问这些值会导致未定义的行为。这就是你观察到的。

写...

int maxAND = 0, maxOR = 0, maxXOR = 0;
int AND = 0, OR = 0, XOR = 0;

或类似的东西,它应该始终如一地工作。

请注意,您不能依赖编译器 "assign" 未初始化变量的值 0;它可能会发生,也许如果你在没有优化的情况下构建,但这种行为可能会以不可预测的方式改变,有时只是通过添加另一个完全不相关的变量。访问未初始化的变量是 always "undefined behaviour".