Форум программистов, компьютерный форум, киберфорум
elnorbert
Войти
Регистрация
Восстановить пароль
Рейтинг: 1.00. Голосов: 2.

Функция sprintf. Замыкающее И, ИЛИ. C, C++, Java.

Запись от elnorbert размещена 28.04.2019 в 19:47
Обновил(-а) 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://ru.wikipedia.org/wiki/Printf
https://en.wikipedia.org/wiki/Printf_format_string


Замыкающие логическое И, ИЛИ; в языке Java

В языке программирования Java есть операторы замыкающего логического И [оператор &&], ИЛИ [оператор ||]

Применяя в составе выражений замыкающие логические операторы, если правильно прочитал в официальной технической по Java, может происходить значительная экономия вычислительных ресурсов:

Для замыкающего логического && значение правого операнда проверяется если значение левого операнда «true».
Для замыкающего логического || значение правого операнда проверяется если значение левого операнда «false».

Замыкающие логические операторы в языке Java. Очень важные подробности!
Будьте очень внимательны: применяя в Java операторы замыкающих логических операций, правый операнд-выражение может не вычисляться. Поэтому, для выражения:

Java
1
a && f1()
, если a = false, передачи управления функции f1() не будет! Для выражения:

Java
1
b || f2()
, если b = true, передачи управления функции f2() не будет!

Если Вы уверены, что произойдет гарантированная передача управления функциям 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++ логические операторы не всегда ведут себя "лениво", а в каких то особых ситуациях.
Размещено в Без категории
Показов 2892 Комментарии 18
Всего комментариев 18
Комментарии
  1. Старый комментарий
    Аватар для Croessmah
    Цитата:
    возможная синтаксическая реализация в C|C++
    Что это значит? В C++ операторы || и && обладают "ленивостью", если не перегружены.
    A || B - B вычисляется только есть A - false
    A && B - B вычисляется только если A - true
    Запись от Croessmah размещена 28.04.2019 в 21:53 Croessmah вне форума
    Обновил(-а) Croessmah 28.04.2019 в 21:55
  2. Старый комментарий
    Цитата:
    Сообщение от Croessmah
    Цитата:
    Сообщение от tolimadokara
    возможная синтаксическая реализация в C|C++
    Что это значит?
    Странно. Разве не понятно? Реализация для Си, в виде синтаксических конструкций, функции замыкающих логических операторов Java: логическое_выражение_2 проверяется только если значение логическое_выражение_1 равно false. и т.д. Для замыкающего логического ИЛИ.

    Цитата:
    Сообщение от Croessmah
    В C++ операторы || и && обладают "ленивостью", если не перегружены.
    Да я полный нуб в C++ А вот Си изучаю уже около 2,5 года по 15 мин. в день

    Цитата:
    Сообщение от Croessmah
    A || B - B вычисляется только есть A - false
    A && B - B вычисляется только если A - true
    Croessmah, +20. лайк! не знал что в С++ такое поведение логических операторов. Вообще о С++ пока что ничего не знаю.
    Запись от elnorbert размещена 29.04.2019 в 09:50 elnorbert вне форума
  3. Старый комментарий
    Аватар для Croessmah
    Цитата:
    А вот Си изучаю уже около 2,5 года по 15 мин. в день
    Цитата:
    не знал что в С++ такое поведение логических операторов
    В C поведение точно такое же.
    Запись от Croessmah размещена 29.04.2019 в 20:08 Croessmah вне форума
  4. Старый комментарий
    Аватар для Evg
    Цитата:
    Сообщение от Croessmah Просмотреть комментарий
    В C поведение точно такое же.
    В фортране вроде бы тоже. И наверное ещё в целой куче других языков
    Запись от Evg размещена 29.04.2019 в 23:28 Evg вне форума
  5. Старый комментарий
    Цитата:
    Сообщение от Croessmah
    В C поведение точно такое же.
    Цитата:
    Сообщение от Croessmah
    В C++ операторы || и && обладают "ленивостью"
    Croessmah, Вы о С++ сказали, а о Си не упомянули - а теперь говорите что в Си поведение точно такое же? Есть стандарты C89, C99, C11. Верно? И во всех стандартах Си логические операторы "ленивые"? В общем посмотрел справочник 2007 года, вроде не нашел упоминания "ленивости" логических операторов в Си. Увидеть бы об этом где-то из справочника, в виде не большой цитаты.

    Цитата:
    Сообщение от Evg
    Цитата:
    Сообщение от Croessmah
    В C поведение точно такое же.
    В фортране вроде бы тоже. И наверное ещё в целой куче других языков
    Познавательно. Если это правда.
    Запись от elnorbert размещена 30.04.2019 в 10:08 elnorbert вне форума
  6. Старый комментарий
    Если в Си логические операторы обладают "ленивостью", тогда в блоге 1/2 этой записи - удаляю.
    Запись от elnorbert размещена 30.04.2019 в 10:14 elnorbert вне форума
  7. Старый комментарий
    Аватар для Rius
    Цитата:
    Будьте очень внимательны в ответственных и коммерческих проектах!
    и не используйте опасный sprintf. Замените его хотя бы на snprintf.
    Запись от Rius размещена 30.04.2019 в 10:58 Rius вне форума
  8. Старый комментарий
    Аватар для Croessmah
    Цитата:
    И во всех стандартах Си логические операторы "ленивые"?
    Да.
    Цитата:
    Увидеть бы об этом где-то из справочника, в виде не большой цитаты.
    Из C89:
    Цитата:
    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 вне форума
    Обновил(-а) Croessmah 02.05.2019 в 16:57
  9. Старый комментарий

    Не по теме:

    Croessmah, у Вас что, в аське подключен плагин под КиберФорум? :D Залогинился, только-что, уже собрался выходить с форума. Случайно увидел новый ответ в этой записи.



    Croessmah, хорошо... проверю в tcc и mingw. Спасибо за цитату из англоязычного справочника. Это очень новое, не знал о таком поведении Си. Да еще и в стандарте, около 30 летней давности.
    Запись от elnorbert размещена 02.05.2019 в 17:05 elnorbert вне форума
  10. Старый комментарий
    Да. Так и есть.

    Windows Batch file
    1
    
    cc -o c_test_2 c_test_2.c
    c_test_2.c
    C
    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.c
    Call 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.
    Win7. Компилятор mingw. Версия, если не ошибаюсь, 2010 года. Смотрел по --version.
    Запись от elnorbert размещена 02.05.2019 в 17:49 elnorbert вне форума
  11. Старый комментарий
    Аватар для Evg
    Когда в одной статье свалена информация про sprintf и про ленивые вычисления, то возникает ощущения, что для полной картины очень не хватает обзора чемпионата Гондураса по футболу за 1978-й год

    Ну и, к слову. Как про sprintf, так и про ленивые вычисления, я что-то понял только потому, что всё это уже знал. Если бы я был начинающим, то про sprintf точно ничего бы не понял, а про ленивые вычисления - может быть и понял бы что-нибудь. В статье очень много слов, среди которых спрятаны какие-то крупицы полезной информации. Лично мой мнение - для начинающих статья скорее всего полезной не окажется. Лучше про это прочитать в любом учебнике
    Запись от Evg размещена 02.05.2019 в 18:27 Evg вне форума
  12. Старый комментарий
    Цитата:
    Сообщение от Evg
    Когда в одной статье свалена информация...

    Не по теме:

    Две очень редких фишки, с которыми хотел поделится с форумчанами: соединение разных переменных в Си, и очень полезные, замыкающие логические операторы в Java. И все. Все очень интересно и полезно! Да, наверное для начинающего - сложновато.

    Очень разная информация, да? Да еще и захламлена текстом в *50 крат? Ну а куда это все девать? В этом большая польза: это очень-очень маленький вклад в развитие форума и не большая микро-помощь. Все очень просто. Да, блин, темы очень разные.

    Много текста: потому что хотел обезопасить читателей от очень опасного поведения &&, || в языке Java. Это действительно очень серьезно! А все никто не читает: заголовок, суть, и все. И то что красным цветом выделено. Поэтому очень много текста для очень простой темы.

    Это очень ответственно все, для автора. Зачем негативный фидбек? Если много просмотров, много читателей - это еще больше ответственней.

    Запись от elnorbert размещена 02.05.2019 в 18:51 elnorbert вне форума
  13. Старый комментарий
    В компиляторе 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 elnorbert вне форума
  14. Старый комментарий
    Аватар для Evg
    Цитата:
    Сообщение от tolimadokara Просмотреть комментарий
    Много текста: потому что хотел обезопасить читателей от очень опасного поведения &&, || в языке Java.
    Ну а что толку? Вместо того, чтобы внятно пояснить на коротких и понятных примерах, ты налил литры воды. И теперь сам себя утешаешь тем, что "много букв и много посетивших страницу (а вовсе не много читателей, как тебе кажется)" - значит всё предельно ясно и понятно для начинающих. Самообман и самовнушение - опасные вещи. Если не хочешь, чтобы тебе писали как есть, а хочешь только слышать диферамбы "вах какая классная статья" - так и напиши, чтобы желающие высказать конструктивную критику не тратили на тебя время
    Запись от Evg размещена 02.05.2019 в 19:59 Evg вне форума
  15. Старый комментарий
    Evg,

    Не по теме:

    Когда автор собирает текст своей публикации...
    Когда автор собирает текст своей публикации, всегда: есть искушение рассказать все подробнее, еще подробнее, и на много более подробнее. В этом случае появляется графомания :D Тогда маленькие крупицы базовой полезной информации обрастают большим количеством текста. Это очень полезно для людей у которых много свободного времени, ровное эмоциональное состояние, хорошая концентрация. Такой читатель способен переработать очень много информации.

    Для тех у кого эти параметры отрицательные: надо собирать публикацию очень короткую.

    Можно встраивать очень много разного тематического текста, но при этом надо как-то его структурировать, систематизировать. Для этого автору надо очень много времени на сборку публикации. При этом публикация и очень короткая получается и очень информативная. Очень классная функциональная фича в функционале почти всех форумов: бб код spoiler=пояснение.

    Знаете, Evg, все очень похоже на закономерность выраженную математической функцией :D Все таки, форум программистов и молодых ученых? :D

    Код:
     ^ A [целостность публикации; связь со смежной информацией]
     | --------------------------------------------------------- 100%
     |                                                                        o
     |                                            o
     |                         o
     |              o
     |         o
     |     o
     |   o
     |  o
     | o
     | o
     + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ->
                            [количество текстовой информации] B
    Что это за математическая функция: не могу сообразить. Что-то похоже на y = a/x; Часто так и замечаешь: что всю публикацию никогда не получится собрать целостной, со всей смежной информацией. Приблизительно, парметра 75-80% хватает. Дальше создается графомания :D

    Вот, данная публикация в виде одного предложения: "Функция 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 elnorbert вне форума
  16. Старый комментарий
    Аватар для netBool
    Цитата:
    не знал что в С++ такое поведение логических операторов. Вообще о С++ пока что ничего не знаю.
    Подобное поведение вообще свойственно почти всем си-подобным языкам. Так же в C# и Javascript
    Запись от netBool размещена 04.05.2019 в 21:24 netBool вне форума
  17. Старый комментарий
    Аватар для Croessmah
    Цитата:
    Спасибо за цитату из англоязычного справочника
    Стандарт - это полная спецификация языка, а не справочник.
    Кстати, у Java тоже имеется спецификация.

    А о подобных "особенностях", пишут, наверное, в любом нормальном учебнике.
    И да, это свойство весьма полезно, а не опасно.
    Запись от Croessmah размещена 05.05.2019 в 23:35 Croessmah вне форума
  18. Старый комментарий
    Цитата:
    Подобное поведение вообще свойственно почти всем си-подобным языкам. Так же в C# и Javascript
    Не знал об этом! Очень интересно!

    Цитата:
    Стандарт - это полная спецификация ... свойство весьма полезно, а не опасно.
    Не знал что в С, С++ похожее поведение логических операторов. Конечно "ленивая" логика очень полезная в программировании! Вот, если второй операнд не выполняется то это очень опасно

    Надо обновить эту запись, с учетом того что во многих языках программирования есть "ленивая" логика. Если верить комментаторам

    Evg. О полезности различного рода веб-публикаций.

    Из нескольких десятков "бетоновых" книг создается создается все множество веб-публикаций. Задача веб-публикации "поднять" из книги очень интересную информацию либо понятно пояснить что-то!

    Веб-публикация экономит время на чтение литературы. Веб-публикация экономит огромное количество мыслительной энергии.

    Согласен: достаточно человеку базовой литературы по своей профессии. Мне тоже очень не нравится идея веб-журналов и википедии.
    Запись от elnorbert размещена 06.05.2019 в 22:27 elnorbert вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru