Как-бы "Порядок вычисления подвыражений в выражениях языка С не определен.", в операторах такая-же фигня?
да.
но тут особый случай: если первый аргумент !=0, то второй НЕ вычисляется. Потому f2() не будет вызвана, если f1() вернёт не ноль. Это относится и к &&, а также к :?
А вот если это *,+,-,*... то выполняются обе функции непонятно в каком порядке.
Как-бы "Порядок вычисления подвыражений в выражениях языка С не определен.", в операторах такая-же фигня?
да.
но тут особый случай: если первый аргумент !=0, то второй НЕ вычисляется. Потому f2() не будет вызвана, если f1() вернёт не ноль. Это относится и к &&, а также к :?
А вот если это *,+,-,*... то выполняются обе функции непонятно в каком порядке.
Хм...., а если функций не две, а n? Там же они могут "по парам" выполниться и потом уже and сделать.
(K&R) писал(а):Операторы || выполняются слева направо. Оператор || выдает 1, если по крайней мере один из операндов не равен нулю, и 0 в противном случае. В отличие от |, оператор || гарантирует, что вычисления будут проводиться слева направо: вычисляется первый операнд, включая все побочные эффекты; если он не равен 0, то значение выражения есть 1. В противном случае вычисляется правый операнд, и если он не равен 0, то значение выражения есть 1, в противном случае оно равно 0.
Операнды могут принадлежать разным типам, но операнд должен иметь либо арифметический тип, либо быть указателем. Тип результата - int.
Bizdelnick, хорошая цитата. А то частенько народ забывает об этом. Я и сам на такие грабли когда-то наступал: думал, что оба операнда выполнятся. А фигвамушки!
Bizdelnick, хорошая цитата. А то частенько народ забывает об этом. Я и сам на такие грабли когда-то наступал: думал, что оба операнда выполнятся. А фигвамушки!
Bizdelnick, хорошая цитата. А то частенько народ забывает об этом. Я и сам на такие грабли когда-то наступал: думал, что оба операнда выполнятся. А фигвамушки!
Оператор || выдает 1, если по крайней мере один из операндов не равен нулю
точнее он выдаёт "не ноль", если первый операнд не равен нулю.
если первый операнд равен нулю, то вычисление продолжается, и результат равен нулю, если второй операнд равен нулю и не равен нулю, если второй не равен.
Оператор || выдает 1, если по крайней мере один из операндов не равен нулю
точнее он выдаёт "не ноль", если первый операнд не равен нулю.
если первый операнд равен нулю, то вычисление продолжается, и результат равен нулю, если второй операнд равен нулю и не равен нулю, если второй не равен.
Про единицу я-бы не стал надеяться...
Bizdelnick прав, такое поведение описано в стандарте. Так что если компилятор возвращает что-то отличное от 0 или 1 (такие есть?), то он нарушает стандарт.
Bizdelnick прав, такое поведение описано в стандарте. Так что если компилятор возвращает что-то отличное от 0 или 1 (такие есть?), то он нарушает стандарт.
А в каком стандарте? И какую еденицу он возвращает? В C99 есть булевые типы, а 1 и истина не совсем одно и тоже. Ну на уровне данных ясень пень одно и тоже, но так то нет.
А в каком стандарте? И какую еденицу он возвращает? В C99 есть булевые типы, а 1 и истина не совсем одно и тоже. Ну на уровне данных ясень пень одно и тоже, но так то нет.
Стандарт С99, С11:
The || operator shall yield 1 if either of its operands compare unequal to 0; otherwise, it yields 0. The result has type int.
(остальных под рукой нет, но там тоже что-то аналогичное)