Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Как работает код?


Автор: Alca 4.5.2009, 10:35
Есть такой код:
Код

 some_func(), 0; 

Как он работает? Зачем там нуль? Вот исходник assert-а: 
Код

/***
*assert.h - define the assert macro
*
*       Copyright (c) Microsoft Corporation. All rights reserved.
*
*Purpose:
*       Defines the assert(exp) macro.
*       [ANSI/System V]
*
*       [Public]
*
****/

#include <crtdefs.h>

#undef  assert

#ifdef  NDEBUG

#define assert(_Expression)     ((void)0)

#else

#ifdef  __cplusplus
extern "C" {
#endif

_CRTIMP void __cdecl _wassert(_In_z_ const wchar_t * _Message, _In_z_ const wchar_t *_File, _In_ unsigned _Line);

#ifdef  __cplusplus
}
#endif

#define assert(_Expression) (void)( (!!(_Expression)) || (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0) )  //??????

#endif  /* NDEBUG */

Автор: xvr 4.5.2009, 11:41
Смотри оператор ','
assert состоит из логического или от условия (оно должно быть истинным), и функции _wassert, которая в чистом виде использованна быть не может, ибо возвращает void, а он не может быть использован в логической операции. Поэтому использованна составная операция из функции (типа void) и числа, соедененные через ','. Эта операция будет вычисляться только если первое условие в логическом или вернет ложь.

Автор: KEHT 4.5.2009, 11:50
Цитата

Еще запятая может применяться в качестве оператора для разделения выражений - в этом случае результатом оператора является значения последнего из перечисленных выражений. Все остальные выражения в списке, разделенном запятыми, вычисляются только ради побочных эффектов.

Автор: Alca 4.5.2009, 11:52
xvrKEHT, спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)