Функция sprintf. Замыкающее И, ИЛИ. C, C++, Java.
Обновил(-а) elnorbert 15.05.2019 в 18:42 (Обновление новой информацией 15.05.2019.)
Приношу свои извинения: в тексте пояснения замыкающих логических операций допущена серьезная ошибка. Эта ошибка исправлена. Редактирование 29.04.2019. Функция sprintf; в языке C, C++ Как можно в C, C++ соединить вместе разнотипные данные? Очень просто. Для этого можно применить функцию sprintf. Функция sprintf. Очень важные подробности!
... первый параметр функции sprintf это блок памяти. Второй параметр это строка форматирования. Третий, четвертый, и т.д., n-й, это список соединяемых переменных.
Функции семейства *print*, *scan* отличаются только тем куда выводятся соединенные разнотипные данные [буфер, консоль, файл] и откуда считываются разнотипные данные для помещения в переменные [из буфера, из консоли, из файла] После завершения работы функции sprintf, в блоке памяти содержатся соединенные значения переменных. Это очень важно! Википедия: Цитата:
Сообщение от https://ru.wikipedia.org/wiki/Printf
Функции семейства printf принимают список аргументов и их размер отдельным параметром (в строке форматирования). Несоответствие строки форматирования и переданных аргументов может приводить к непредсказуемому поведению, повреждению стека и выполнению произвольного кода, приводить к разрушению областей динамической памяти. Многие функции семейства называются «небезопасными» (англ. unsafe), так как не имеют даже теоретической возможности для защиты от некорректных данных.
https://en.wikipedia.org/wiki/Printf_format_string Замыкающие логическое И, ИЛИ; в языке Java В языке программирования Java есть операторы замыкающего логического И [оператор &&], ИЛИ [оператор ||] Применяя в составе выражений замыкающие логические операторы, если правильно прочитал в официальной технической по Java, может происходить значительная экономия вычислительных ресурсов: Для замыкающего логического && значение правого операнда проверяется если значение левого операнда «true». Для замыкающего логического || значение правого операнда проверяется если значение левого операнда «false». Замыкающие логические операторы в языке Java. Очень важные подробности!
Будьте очень внимательны: применяя в Java операторы замыкающих логических операций, правый операнд-выражение может не вычисляться. Поэтому, для выражения:
Если Вы уверены, что произойдет гарантированная передача управления функциям f1() и f2() и возврат ихнего значения - то очень сильно ошибаетесь! Гарантированной, 100% передачи управления функциям f1() и f2(), применяя операторы замыкающих логических операторов - не будет! Это замечание относится и к операндам с префиксными и постфиксными унарными операторами инкрементирования и декрементирования: ++, --; которые содержатся в правой части замыкающего логического оператора. https://docs.oracle.com/javase... #jls-15.23 https://docs.oracle.com/javase... #jls-15.24 Это очень важно для безопасности проекта над которым Вы работаете! Последствия не внимательности при работе с замыкающими логическими операторами могут быть катастрофическими! Очень хорошая идея, для замыкающих логических операций в Java, перечислять входящие выражения в порядке убывания вероятности возникновения значения «false» [для оператора &&]; «true» [для оператора ||] Не проверенная информация! Замыкающее логическое И, ИЛИ, присуще не только языку Java, но и еще некоторым языкам программирования. Об этом говорили читатели которые комментируют данную блоговую статью. Не проверенная информация! Действительно, в языке С, поведение операторов &&, ||, аналогичное, на сколько это смог проверить автор, поведению операторов &&, || в языке программирования Java. Не известно, все ли стандарты языка C, c89, c99, c11, поддерживают замыкающие логические функции? Не проверенная информация! В языке C++ замыкающее логическое И, ИЛИ, иногда называют "ленивостью". В языке C++ логические операторы не всегда ведут себя "лениво", а в каких то особых ситуациях. |
-
Запись от Croessmah размещена 28.04.2019 в 21:53
Обновил(-а) Croessmah 28.04.2019 в 21:55 -
Цитата:Сообщение от CroessmahЦитата:Сообщение от tolimadokaraвозможная синтаксическая реализация в C|C++
Цитата:Сообщение от CroessmahВ C++ операторы || и && обладают "ленивостью", если не перегружены.
Цитата:Сообщение от CroessmahA || B - B вычисляется только есть A - false
A && B - B вычисляется только если A - trueЗапись от elnorbert размещена 29.04.2019 в 09:50 -
Запись от Croessmah размещена 29.04.2019 в 20:08 -
Запись от Evg размещена 29.04.2019 в 23:28 -
Цитата:Сообщение от CroessmahВ C поведение точно такое же.Цитата:Сообщение от CroessmahВ C++ операторы || и && обладают "ленивостью"
Цитата:Сообщение от EvgЦитата:Сообщение от CroessmahВ C поведение точно такое же.Запись от elnorbert размещена 30.04.2019 в 10:08 -
Если в Си логические операторы обладают "ленивостью", тогда в блоге 1/2 этой записи - удаляю.
Запись от elnorbert размещена 30.04.2019 в 10:14 -
Запись от Rius размещена 30.04.2019 в 10:58 -
Цитата:И во всех стандартах Си логические операторы "ленивые"?
Цитата:Увидеть бы об этом где-то из справочника, в виде не большой цитаты.
Цитата:6.3.13 Logical AND operator
...
Unlike the bitwise binary & operator, the && operator guarantees left-to-right evaluation: there is a sequence point after the evaluation of the first operand. If the first operand compares equal to 0, the second operand is not evaluated.Запись от Croessmah размещена 02.05.2019 в 16:56
Обновил(-а) Croessmah 02.05.2019 в 16:57 -
Не по теме:
Croessmah, у Вас что, в аське подключен плагин под КиберФорум? :D Залогинился, только-что, уже собрался выходить с форума. Случайно увидел новый ответ в этой записи.
Croessmah, хорошо... проверю в tcc и mingw. Спасибо за цитату из англоязычного справочника. Это очень новое, не знал о таком поведении Си. Да еще и в стандарте, около 30 летней давности.Запись от elnorbert размещена 02.05.2019 в 17:05 -
Да. Так и есть.
Windows Batch file 1
cc -o c_test_2 c_test_2.c
c_test_2.cC 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
#include <stdio.h> unsigned short int f1() { printf("Call f1().\n"); return 0; } unsigned short int f2() { printf("Call f2().\n"); return 0; } int main() { printf("Call 1-st instance.\n"); f1() && f2(); printf("End of call 1-st instance.\n\n"); printf("Call 2-nd instance.\n"); !f1() && f2(); printf("End of call 2-nd instance.\n\n"); return 0; }
Ответ:
Цитата:Сообщение от c_test_2.cCall 1-st instance.
Call f1().
End of call 1-st instance.
Call 2-nd instance.
Call f1().
Call f2().
End of call 2-nd instance.Запись от elnorbert размещена 02.05.2019 в 17:49 -
Когда в одной статье свалена информация про sprintf и про ленивые вычисления, то возникает ощущения, что для полной картины очень не хватает обзора чемпионата Гондураса по футболу за 1978-й год
Ну и, к слову. Как про sprintf, так и про ленивые вычисления, я что-то понял только потому, что всё это уже знал. Если бы я был начинающим, то про sprintf точно ничего бы не понял, а про ленивые вычисления - может быть и понял бы что-нибудь. В статье очень много слов, среди которых спрятаны какие-то крупицы полезной информации. Лично мой мнение - для начинающих статья скорее всего полезной не окажется. Лучше про это прочитать в любом учебникеЗапись от Evg размещена 02.05.2019 в 18:27 -
Цитата:Сообщение от EvgКогда в одной статье свалена информация...
Не по теме:
Две очень редких фишки, с которыми хотел поделится с форумчанами: соединение разных переменных в Си, и очень полезные, замыкающие логические операторы в Java. И все. Все очень интересно и полезно! Да, наверное для начинающего - сложновато.
Очень разная информация, да? Да еще и захламлена текстом в *50 крат? Ну а куда это все девать? В этом большая польза: это очень-очень маленький вклад в развитие форума и не большая микро-помощь. Все очень просто. Да, блин, темы очень разные.
Много текста: потому что хотел обезопасить читателей от очень опасного поведения &&, || в языке Java. Это действительно очень серьезно! А все никто не читает: заголовок, суть, и все. И то что красным цветом выделено. Поэтому очень много текста для очень простой темы.
Это очень ответственно все, для автора. Зачем негативный фидбек? Если много просмотров, много читателей - это еще больше ответственней.Запись от elnorbert размещена 02.05.2019 в 18:51 -
В компиляторе mingw, в cc, есть флаг std. При сборке проверочного кода значение std не конкретизировал. То есть использовалось его значение по умолчанию. А что это за значение - не знаю. Если читателю интересно - читайте gcc.pdf. Можно прям так и спросить у поисковой системы. Обязательно выходите на официальный сайт авторов проекта.
Возможные, основные, в стандартной сборке, если не ошибаюсь, значения флага std:
Windows Batch file 1
... std=c89
Windows Batch file 1
... std=c99
... есть еще какие-то.Windows Batch file 1
... std=c11
Запись от elnorbert размещена 02.05.2019 в 19:03 -
Ну а что толку? Вместо того, чтобы внятно пояснить на коротких и понятных примерах, ты налил литры воды. И теперь сам себя утешаешь тем, что "много букв и много посетивших страницу (а вовсе не много читателей, как тебе кажется)" - значит всё предельно ясно и понятно для начинающих. Самообман и самовнушение - опасные вещи. Если не хочешь, чтобы тебе писали как есть, а хочешь только слышать диферамбы "вах какая классная статья" - так и напиши, чтобы желающие высказать конструктивную критику не тратили на тебя время
Запись от Evg размещена 02.05.2019 в 19:59 -
Evg,
Не по теме:
Когда автор собирает текст своей публикации...Когда автор собирает текст своей публикации, всегда: есть искушение рассказать все подробнее, еще подробнее, и на много более подробнее. В этом случае появляется графомания :D Тогда маленькие крупицы базовой полезной информации обрастают большим количеством текста. Это очень полезно для людей у которых много свободного времени, ровное эмоциональное состояние, хорошая концентрация. Такой читатель способен переработать очень много информации.
Для тех у кого эти параметры отрицательные: надо собирать публикацию очень короткую.
Можно встраивать очень много разного тематического текста, но при этом надо как-то его структурировать, систематизировать. Для этого автору надо очень много времени на сборку публикации. При этом публикация и очень короткая получается и очень информативная. Очень классная функциональная фича в функционале почти всех форумов: бб код spoiler=пояснение.
Знаете, Evg, все очень похоже на закономерность выраженную математической функцией :D Все таки, форум программистов и молодых ученых? :D
Код:^ A [целостность публикации; связь со смежной информацией] | --------------------------------------------------------- 100% | o | o | o | o | o | o | o | o | o | o + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -> [количество текстовой информации] B
Вот, данная публикация в виде одного предложения: "Функция sprintf стандартной библиотеки Си; Замыкающие логические операторы в языке Java." Все :D Уже 75% целостности публикации :D Но к этому надо добавить, что "информация очень полезная", и то что это действительно так и есть, с чем согласится каждый читатель.
Тяжеловато все это пояснить. Странная информация.
Короче говоря, по простому: sprintf это сила! огромная экономия времени программирования! для sprintf можно быть junior программистом. замыкающие И, ИЛИ в языке Java это тоже сила! это сильнейшая экономия вычислительных ресурсов компьютера! что бы это все найти в справочниках, автор публикации просмотрел около 100 - 200 страниц А4 текста справочников и потратил на это 2*7*24 часов времени на чтение. не рассказывать про if, for, while и математических выражениях? верно? в этом 0 пользы.Запись от elnorbert размещена 02.05.2019 в 20:22 -
Запись от netBool размещена 04.05.2019 в 21:24 -
Запись от Croessmah размещена 05.05.2019 в 23:35 -
Цитата:Подобное поведение вообще свойственно почти всем си-подобным языкам. Так же в C# и Javascript
Цитата:Стандарт - это полная спецификация ... свойство весьма полезно, а не опасно.
Надо обновить эту запись, с учетом того что во многих языках программирования есть "ленивая" логика. Если верить комментаторам
Evg. О полезности различного рода веб-публикаций.
Из нескольких десятков "бетоновых" книг создается создается все множество веб-публикаций. Задача веб-публикации "поднять" из книги очень интересную информацию либо понятно пояснить что-то!
Веб-публикация экономит время на чтение литературы. Веб-публикация экономит огромное количество мыслительной энергии.
Согласен: достаточно человеку базовой литературы по своей профессии. Мне тоже очень не нравится идея веб-журналов и википедии.Запись от elnorbert размещена 06.05.2019 в 22:27