хорошо понимаю, как работает данное вырожение с оператором if
if (a>b && b>c) {}
но часто встречаю другое вырожение в программах и вот никак не могу понять, как работает
if(a & b) {}
Объясните плиз
Код: Выделить всё
if(a & b) {}хм. вроде понял.md5sum писал(а):Ести битовое И операндов a и b !=0, то trueКод: Выделить всё
if(a & b) {}
Да, перефразирую в общем видеk000858 писал(а):то есть if(a) {} - это "если а!=0" так?
правильнее было бы перефразировать без упоминания несуществующих в Си терминов "истина" и т.п. - просто "если выражение не равно нулю".Gudd-Head писал(а):Да, перефразирую в общем видеk000858 писал(а):то есть if(a) {} - это "если а!=0" так?
if(выражение)
{
делаем если выражение = истина, т.е. ≠ 0;
};
Т.е. результат сравнения a>b может быть либо нулём, либо...?ARV писал(а):правильнее было бы перефразировать без упоминания несуществующих в Си терминов "истина" и т.п. - просто "если выражение не равно нулю".
либо НЕ НУЛЕМGudd-Head писал(а):Т.е. результат сравнения a>b может быть либо нулём, либо...?
Вот и ввели человека в заблуждение - логическое И: &&Rusja2008 писал(а):А конкретно в Вашем случае if(a & b) {} условие будет выполнятся только если логическое & между a и b будет истино (по большому счету и a и b должны быть больше 0).
Код: Выделить всё
int a = 4;
int b = 5;
int с = 6;
c += b > a;
printf("%d %d %d\n", a > b, a < b, c);И сносочка3.3.8 Relational operators
...
Each of the operators < (less than), > (greater than), <= (less than or equal to), and >= (greater than or equal to) shall yield 1 if
the specified relation is true and 0 if it is false. The result has type int.
А также38. The expression a<b<c is not interpreted as in ordinary mathematics. As the syntax indicates, it means (a<b)<c ; in other
words, ``if a is less than b compare 1 to c ; otherwise compare 0 to c.''
3.3.13 Logical AND operator
...
The && operator shall yield 1 if both of its operands compare unequal to 0, otherwise it yields 0.
The result has type int.
...
3.3.14 Logical OR operator
The || operator shall yield 1 if either of its operands compare unequal to 0, otherwise it yields 0. The result has type int.
Код: Выделить всё
int a, b;
a = !!b;
Итого двойной ! приводит значение к 0 или 1, заменяя собойThe result of the logical negation operator ! is 0 if the value of its operand compares unequal to 0, 1 if the value of its operandcompares equal to 0. The result has type int . The expression !E is equivalent to (0==E) .
Код: Выделить всё
a = b ? 1 : 0;Код: Выделить всё
int a, b;
if (!a != !b) puts("Только одна из переменных a и b равна 0");
if (!a == !b) puts("Обе переменные 0 либо обе не 0");Код: Выделить всё
int a, b;
if ( (a == 0 && b != 0) || (a != 0 && b == 0) ) puts("Только одна из переменных a и b равна 0");
if ( (a == 0 && b == 0) || (a != 0 && b != 0) ) puts("Обе переменные 0 либо обе не 0");во-первых, ругаться тут ни один компилятор не будетAlexeus писал(а):cvavr.
Подскажите пожалуйста, если переменная была заявлена как целая, а результат арифметической операции, который должен быть в нее занесен- с точкой, то автоматически округлится до целого или нужно округлять как то?
char a;
char x=100;
char y=8;
a=x/y; //результат= 12.5, что будет в а? (cvavr не ругается)
повторяю: в вашей программе результат от деления x на y будет 12, и никак иначе. это не к слову - это факт.Alexeus писал(а):100/8 вообще то 12.5, а 12*8=96, ну это так, к слову... так что вопрос остается открытым.
С одной стороны, согласен.ARV писал(а):ведь запись !a != !b гораздо непонятнее, чем более длинная "развернутая" запись. дело именно НЕ В КРАТКОСТИ, а в "элитарности"
Код: Выделить всё
*dst++ = *src++;Код: Выделить всё
*dst = *src;
dst = dst + 1;
src = src + 1;