我正在编写一个简单的for循环,用于检查数组中是否存在偶数和奇数。
我要弄清楚的是为什么没有优化局部变量以仅用作布尔值,并且仍然在每个循环中递增。
我将计数限制为uint8_t,而计数器为uint32_t,因此没有溢出的机会。
Godbolt链接:https://godbolt.org/z/H7l-Ht
在godbolt链接中可以看到汇编输出,但是在此处粘贴的C代码很容易看到。
第一个循环只是将值设置为true和false;
#include <stddef.h>
#include <stdbool.h>
#include <stdint.h>
bool hasEvenAndOdd(int* values, uint8_t count) {
uint32_t even = 0;
uint32_t odd = 0;
for (uint8_t i = 0; i < count; i++) {
if (values[i] % 2 == 1) {
odd = 1;
} else {
even = 1;
}
}
return (even && odd);
}
带有计数器的第二个循环:
#include <stddef.h>
#include <stdbool.h>
#include <stdint.h>
bool hasEvenAndOdd(int* values, uint8_t count) {
uint32_t even = 0;
uint32_t odd = 0;
for (uint8_t i = 0; i < count; i++) {
if (values[i] % 2 == 1) {
odd++;
} else {
even++;
}
}
return (even && odd);
}
我想我的问题是,编译器能否使用计数器仅用作布尔值的信息来优化所有不需增加的增量,并且仅执行单个增量。
谢谢!