【问题标题】:C Program with Bitwise Operators Only Functions Correctly with Debug Statements只有按位运算符的 C 程序才能在调试语句中正确运行
【发布时间】:2020-05-27 20:25:43
【问题描述】:

我正在努力解决这个挑战:

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

  • a & b的最大值,小于给定整数k,其中 ab 是集合 s 中的两个整数。
  • a的最大值| b,小于给定整数 k,其中 ab 是集合 s 中的两个整数。
  • a ^ b的最大值,小于给定整数k,其中 ab 是集合 s 中的两个整数。

输入格式:唯一一行包含2个空格分隔的整数,分别为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

这里有一点:当我每次包含调试语句时,程序都会打印出我所期望的内容。 如果我添加这个

printf("I: %d J: %d OR: %d\n", i, j, OR);
在第 13 行,程序现在打印出 我:1 焦:2 或:3 我:1 焦:3 或:3 我:1 焦:4 或:5 我:1 焦:5 或:5 我:2 焦:3 或:3 我:2 焦:4 或:6 我:2 焦:5 或:7 我:3 焦:4 或:7 我:3 焦:5 或:7 我:4 焦:5 或:5 2 3 3

这正是我所期望的。 任何想法为什么这个程序只输出我期望的包含额外的 printf 的?

【问题讨论】:

    标签: c for-loop printf bitwise-operators


    【解决方案1】:

    在你的变量定义中

    int maxAND, maxOR, maxXOR = 0;
    

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

    写...

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

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

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

    【讨论】:

    • 谢谢,我假设内联多变量 decleration 会将值分配给所有最大变量。
    【解决方案2】:

    您的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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-19
      • 2011-10-31
      • 1970-01-01
      • 1970-01-01
      • 2015-02-08
      相关资源
      最近更新 更多