MIN и MAX в C

Это потому, что вы ничего не пишете для консоли или интерфейса. Debug.write отличается от console.write

Кроме того, функция делегата может возвращаться через 1 секунду. Лучшая парадигма будет использовать await.

Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click  
    ' Call the method that runs asynchronously.  
    Dim result As String = Await WaitAsynchronouslyAsync()  

    ' Call the method that runs synchronously.  
    'Dim result As String = Await WaitSynchronously()  

    ' Display the result.  
    TextBox1.Text &= result  
End Sub  

' The following method runs asynchronously. The UI thread is not  
' blocked during the delay. You can move or resize the Form1 window   
' while Task.Delay is running.  
Public Async Function WaitAsynchronouslyAsync() As Task(Of String)  
    Await Task.Delay(10000)  
    Return "Finished"  
End Function  

' The following method runs synchronously, despite the use of Async.  
' You cannot move or resize the Form1 window while Thread.Sleep  
' is running because the UI thread is blocked.  
Public Async Function WaitSynchronously() As Task(Of String)  
    ' Import System.Threading for the Sleep method.  
    Thread.Sleep(10000)  
    Return "Finished"  
End Function

https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/operators/await-operator

264
задан a3f 31 March 2015 в 18:28
поделиться

5 ответов

Где MIN и MAX определены в C, если они вообще определены?

Нет.

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

Как функции. Я бы не стал использовать макросы вроде #define MIN (X, Y) (((X) <(Y))? (X): (Y)) , особенно если вы планируете развернуть свой код. Либо напишите свой, используйте что-то вроде стандартного fmax или fmin , либо исправьте макрос, используя GCC typeof (вы также получите бонус за безопасность типов) в Выражение оператора GCC :

 #define max(a,b) \
   ({ __typeof__ (a) _a = (a); \
       __typeof__ (b) _b = (b); \
     _a > _b ? _a : _b; })

Все говорят: «О, я знаю о двойном вычислении, это не проблема», и через несколько месяцев вы будете часами отлаживать самые глупые проблемы.

Обратите внимание на использование __ typeof __ вместо typeof :

Если вы пишете файл заголовка, должен работать при включении в ISO C программ, напишите __ typeof __ вместо тип .

352
ответ дан 23 November 2019 в 02:28
поделиться

@David Titarenco закрепил его здесь , но позвольте мне, по крайней мере, очистить его немного, чтобы заставить его выглядеть хорошим, и показать и min() и max() вместе для создания копирования и вставки отсюда легче.:)

1. Старый макро-путь C:

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

#define MAX(a,b) ((a) > (b) ? (a) : (b))
#define MIN(a,b) ((a) < (b) ? (a) : (b))

2. Новый и улучшенный gcc" выражение оператора" путь:

Эта техника избегает вышеупомянутых побочных эффектов "двойной оценки" и ошибок, и поэтому считается начальником, более в безопасности, и "более современным" способ GCC C сделать это:

, НО: ДЕЙСТВИТЕЛЬНО не упустите" переменное затенение " эффекты все еще, поскольку выражения оператора, по-видимому, встраиваются и поэтому НЕ имеют своего собственного объема локальной переменной!

#define max(a,b)             \
({                           \
    __typeof__ (a) _a = (a); \
    __typeof__ (b) _b = (b); \
    _a > _b ? _a : _b;       \
})

#define min(a,b)             \
({                           \
    __typeof__ (a) _a = (a); \
    __typeof__ (b) _b = (b); \
    _a < _b ? _a : _b;       \
})

Примечание, что в gcc выражениях оператора, последнее выражение в блоке кода - то, что "возвращается" из выражения, как будто это было возвращено из функции. в документации GCC говорится это этот путь:

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

Примечание C++: при использовании C++ шаблоны, вероятно, рекомендуются для этого типа конструкции вместо этого.

Ссылки:

  1. https://gcc.gnu.org/onlinedocs/gcc/Typeof.html#Typeof
  2. https://МИН gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html#Statement-Exprs
  3. и МАКС в C
1
ответ дан 23 November 2019 в 02:28
поделиться

В C ++ есть std :: min и std :: max , но, AFAIK, эквивалента в стандартной библиотеке C нет. Вы можете определить их самостоятельно с помощью макросов типа

#define MAX(x, y) (((x) > (y)) ? (x) : (y))
#define MIN(x, y) (((x) < (y)) ? (x) : (y))

, но это вызовет проблемы, если вы напишете что-то вроде MAX (++ a, ++ b) .

69
ответ дан 23 November 2019 в 02:28
поделиться

Он также содержится в версиях sys/param.h в GNU libc (Linux) и FreeBSD, и имеет определение, предоставленное dreamlax.


На Debian:

$ uname -sr
Linux 2.6.11

$ cat /etc/debian_version
5.0.2

$ egrep 'MIN\(|MAX\(' /usr/include/sys/param.h
#define MIN(a,b) (((a)<(b))?(a):(b))
#define MAX(a,b) (((a)>(b))?(a):(b))

$ head -n 2 /usr/include/sys/param.h | grep GNU
This file is part of the GNU C Library.

На FreeBSD:

$ uname -sr
FreeBSD 5.5-STABLE

$ egrep 'MIN\(|MAX\(' /usr/include/sys/param.h
#define MIN(a,b) (((a)<(b))?(a):(b))
#define MAX(a,b) (((a)>(b))?(a):(b))

Репозитории исходников находятся здесь:

85
ответ дан 23 November 2019 в 02:28
поделиться

Я не думаю, что это стандартизированные макросы. Для плавающей точки уже есть стандартизированные функции, fmax и fminfmaxf для плавающих чисел, и fmaxl для длинных двоек).

Вы можете реализовать их как макросы, если вы знаете о побочных эффектах/оценке двойников.

#define MAX(a,b) ((a) > (b) ? a : b)
#define MIN(a,b) ((a) < (b) ? a : b)

В большинстве случаев вы можете оставить компилятору право определить, что вы пытаетесь сделать, и оптимизировать это как можно лучше. Хотя это вызывает проблемы при использовании типа MAX(i++, j++), я сомневаюсь, что есть большая необходимость в проверке максимального из увеличиваемых значений за один раз. Сначала инкрементируйте, затем проверяйте.

19
ответ дан 23 November 2019 в 02:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: