Цитата(HEX @ Jul 22 2009, 11:56)

выводит только "true"
Я уже объясняла, что сложности с набитыми мусором булевскими переменными возникают исключительно при проведении булевских
операций над ними, что заставляет компилятор во имя эффективности использовать только младший бит этого числа. Однако при проверке булевой переменной (например для ветвления по оператору if) такой проблемы не возникает, и тут компилятор проверяет переменную "честно". Это потому, что поверка одного бита "стоит" ровно столько же, сколько проверка всех битов - тестирование регистра на нулевое значение занимает столько же инструкций, как и тестирование одного его бита. А вот булевские операции (типа ! ~ ^ & |) над одним битом производятся элементарно, а над мусорными переменными нет.
Код
//B = 13
if (B == true)
printf("true\n");
else
printf("false\n");
- тут B тестируется на ненулевое значение, а потому ЛЮБОЕ ненулевое значение B напечатает true.
Код
B = !B;
if (B == true)
printf("true\n");
else
printf("false\n");
- а тут операция B = !B компилируется экономно - инверсией младшего бита. Можно было бы сразу инвертировать все биты числа, но мусор от этого останется мусором, но в false не превратится.
Попробуйте сами вместо компилятора оттранслировать B = !B. Тогда поймете, что без ветвления по if/else этого сделать нельзя.
Код
//Избавляемся от мусора
if (B)
B = true;
else
B = false;
Избавляться от мусора короче так:
B = B ? true : false;