带有逐位运算符的C程序只能通过调试语句正确运行

问题描述 投票:0回答:2

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

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

  • ab的最大值,小于给定的整数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;
}

在我看来,它似乎应该可以工作,不幸的是,它可以打印出来

2243

而不是我的预期

233

甚至很奇怪,有时程序也会为maxAND打印一个看似随机的数字,并且看起来像

1910024400243

这很麻烦:每当包含调试语句时,该程序都会打印出我期望的内容。如果我在第13行添加此

printf(“ I:%d J:%d OR:%d \ n”,i,j,OR);,现在该程序将输出
I:1 J:2 OR:3I:1 J:3 OR:3I:1 J:4 OR:5I:1 J:5 OR:5I:2 J:3 OR:3I:2 J:4 OR:6I:2 J:5 OR:7I:3 J:4 OR:7I:3 J:5 OR:7I:4 J:5 OR:5233

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

我正在尝试解决这个挑战:任务:给定集合S = {1,2,3,... n},找到:a&b的最大值,小于给定的整数k,其中a和b是来自set的两个整数。 ...

c for-loop printf bitwise-operators
2个回答
0
投票

0
投票
© www.soinside.com 2019 - 2024. All rights reserved.