Я начал доказывать, что существуют транзитивности, которые можно оптимизировать под постоянные; Я не мог Как отмечалось анонимно, предыдущий код может предоставить ограничения, которые компилятор использует для вырождения выражений в константы.
Но в случае сомнений выведите таблицу истинности:
#include <stdio.h>
int main() {
int i, j, k, l, x;
for(i = 0; i < 2; i++)
for(j = 0; j < 2; j++)
for(k = 0; k < 2; k++)
for(l = 0; l < 2; l++) {
x = ((i == j) + (k == l) + ((i == k) & (j == l)));
printf("%d %d %d %d: %d, %d, %d -> %d\n", i, j, k, l, (i == j),
(k == l), ((i == k) & (j == l)), x);
}
return 0;
}
Что дает:
0 0 0 0: 1, 1, 1 -> 3
0 0 0 1: 1, 0, 0 -> 1
0 0 1 0: 1, 0, 0 -> 1
0 0 1 1: 1, 1, 0 -> 2
0 1 0 0: 0, 1, 0 -> 1
0 1 0 1: 0, 0, 1 -> 1
0 1 1 0: 0, 0, 0 -> 0
0 1 1 1: 0, 1, 0 -> 1
1 0 0 0: 0, 1, 0 -> 1
1 0 0 1: 0, 0, 0 -> 0
1 0 1 0: 0, 0, 1 -> 1
1 0 1 1: 0, 1, 0 -> 1
1 1 0 0: 1, 1, 0 -> 2
1 1 0 1: 1, 0, 0 -> 1
1 1 1 0: 1, 0, 0 -> 1
1 1 1 1: 1, 1, 1 -> 3
Под gcc и g ++ 4.4.3 и без предупреждений с установленным -Wall
. Даже если i, j, k и l объявлены const
, компилятор не видит x
как инвариант. Компилятор кажется либо трансцендентно умным, либо сломанным.