Зачем использовать назначение в состоянии?

На многих языках задания являются законными в условиях. Я никогда не понимал причины этого. Зачем вам писать:

if (var1 = var2) { ... } 

вместо:

 var1 = var2; if (var1) { ... } 

    Это более полезно для циклов, чем для операторов.

     while( var = GetNext() ) { ...do something with var } 

    Который в противном случае должен был быть написан

     var = GetNext(); while( var ) { ...do something var = GetNext(); } 

    Это более полезно, если вы вызываете функцию:

     if (n = foo()) { /* foo returned a non-zero value, do something with the return value */ } else { /* foo returned zero, do something else */ } 

    Конечно, вы можете просто положить n = foo (); на отдельном утверждении, то if (n), но я думаю, что вышеизложенное является довольно читаемой идиомой.

    Я нахожу его наиболее полезным в цепочках действий, которые часто связаны с обнаружением ошибок и т. Д.

     if ((rc = first_check(arg1, arg2)) != 0) { report error based on rc } else if ((rc = second_check(arg2, arg3)) != 0) { report error based on new rc } else if ((rc = third_check(arg3, arg4)) != 0) { report error based on new rc } else { do what you really wanted to do } 

    Альтернативой (не используя присвоение в условии) является:

     rc = first_check(arg1, arg2); if (rc != 0) { report error based on rc } else { rc = second_check(arg2, arg3); if (rc != 0) { report error based on new rc } else { rc = third_check(arg3, arg4); if (rc != 0) { report error based on new rc } else { do what you really wanted to do } } } 

    При длительной проверке ошибок альтернатива может выходить из RHS страницы, тогда как условно-условная версия этого не делает.

    Это может быть полезно, если вы вызываете функцию, которая возвращает данные для работы или флаг, чтобы указать на ошибку (или что вы сделали).

    Что-то вроде:

     while ((c = getchar()) != EOF) { // process the character } // end of file reached... 

    Лично это идиома, которую я не очень люблю, но иногда альтернатива уродливее.

    GCC может помочь вам обнаружить (с -Wall), если вы непреднамеренно попытаетесь использовать назначение как значение истины, если оно рекомендует писать

     if ((n = foo())) { ... } 

    Т.е. используйте дополнительные круглые скобки, чтобы указать, что это действительно то, что вы хотите.

    Идиома более полезна, когда вы пишете цикл while вместо оператора if . Для оператора if вы можете разбить его, как вы описываете. Но без этой конструкции вам придется либо повторить:

     c = getchar(); while (c != EOF) { // ... c = getchar(); } 

    или используйте структуру «петля и половина»:

     while (true) { c = getchar(); if (c == EOF) break; // ... } 

    Обычно я предпочитаю форму «полуторачасть».

    Например, в PHP полезно циклически выполнять результаты SQL-базы данных:

     while ($row = mysql_fetch_assoc($result)) { // Display row } 

    Это выглядит намного лучше, чем:

     $row = mysql_fetch_assoc($result); while ($row) { // Display row $row = mysql_fetch_assoc($result); } 

    Короткий ответ заключается в том, что язык программирования, ориентированный на выражение, позволяет использовать более сжатый код. Не заставляйте вас отделять команды от запросов .

    Другое преимущество возникает при использовании gdb. В следующем коде код ошибки не известен, если мы должны сделать один шаг.

     while (checkstatus() != -1) { // process } 

    Скорее

     while (true) { int error = checkstatus(); if (error != -1) // process else //fail } 

    Теперь в течение одного шага мы можем узнать, каков был код ошибки возврата из checkstatus ().

     if((var = someFunction())){ //Enclosed in additional pair of brackets to show its intentional ... 

    Вышеуказанное можно использовать вместо …

     var = someFunction(); if(var){ ... 

    Причина в следующем:

    1. Повышение производительности (иногда)

    2. Малый код (всегда)

    Возьмем пример: существует метод someMethod() и в if вы хотите проверить, является ли возвращаемое значение метода равным null . Если нет, вы снова будете использовать возвращаемое значение.

     If(null != someMethod()){ String s = someMethod(); ...... //Use s } 

    Это будет мешать производительности, так как вы вызываете тот же метод дважды. Вместо этого используйте:

     String s; If(null != (s = someMethod())) { ...... //Use s } 
    Interesting Posts

    PDF-документы для склейки (наложения)

    Циркулярные ссылки в Java

    Как использовать совместное использование совместного использования изображений для совместного использования изображений в Android?

    Android обнаружит, что нажатие клавиши «Готово» для клавиатуры OnScreen

    jqGrid: использование beforeProcessing для заполнения блоков выбора filterToolbar

    Как перенести данные и настройки Google Chrome на другой аккаунт Google?

    Наушники usb только воспроизводят определенный звук

    Странное поведение в функции PowerShell, возвращающее DataSet / DataTable

    «Пространства» или несколько рабочих столов для одного монитора в системе Multi-Monitor?

    Добавление прокручиваемой JTextArea (Java)

    Как вы получаете текущий номер страницы ViewPager для Android?

    Отправка сообщения всем клиентам (связь Client-Server)

    Проверка подлинности REST и отображение ключа API

    C getline () – как работать с буферами / как читать неизвестное количество значений в массиве

    Запись экрана в Windows 8 делает ПК непригодным для использования?

    Давайте будем гением компьютера.