只有按位运算符的 C 程序才能正确地使用调试语句
C Program with Bitwise Operators Only Functions Correctly with Debug Statements
我正在尝试解决这个挑战:
任务:
给定集合 S = {1, 2, 3, ...n},找到:
- a&b的最大值,小于给定整数k, 在哪里
a 和 b 是集合 s.
中的两个整数
- 最大值a | b,小于给定整数 k,其中
a 和 b 是集合 s.
中的两个整数
- a^b的最大值,小于给定整数k, 在哪里
a 和 b 是集合 s.
中的两个整数
输入格式:唯一一行包含2个space分隔的整数,n和k ,分别
我写了这个 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
,但 maxAND
和 maxOR
仍未初始化。稍后访问这些值会导致未定义的行为。这就是你观察到的。
写...
int maxAND = 0, maxOR = 0, maxXOR = 0;
int AND = 0, OR = 0, XOR = 0;
或类似的东西,它应该始终如一地工作。
请注意,您不能依赖编译器 "assign" 未初始化变量的值 0
;它可能会发生,也许如果你在没有优化的情况下构建,但这种行为可能会以不可预测的方式改变,有时只是通过添加另一个完全不相关的变量。访问未初始化的变量是 always "undefined behaviour".
我正在尝试解决这个挑战:
任务: 给定集合 S = {1, 2, 3, ...n},找到:
- a&b的最大值,小于给定整数k, 在哪里 a 和 b 是集合 s. 中的两个整数
- 最大值a | b,小于给定整数 k,其中 a 和 b 是集合 s. 中的两个整数
- a^b的最大值,小于给定整数k, 在哪里 a 和 b 是集合 s. 中的两个整数
输入格式:唯一一行包含2个space分隔的整数,n和k ,分别
我写了这个 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
,但 maxAND
和 maxOR
仍未初始化。稍后访问这些值会导致未定义的行为。这就是你观察到的。
写...
int maxAND = 0, maxOR = 0, maxXOR = 0;
int AND = 0, OR = 0, XOR = 0;
或类似的东西,它应该始终如一地工作。
请注意,您不能依赖编译器 "assign" 未初始化变量的值 0
;它可能会发生,也许如果你在没有优化的情况下构建,但这种行为可能会以不可预测的方式改变,有时只是通过添加另一个完全不相关的变量。访问未初始化的变量是 always "undefined behaviour".