Ставите ли вы пробел после скобки?
забань его.

клева!
Есть у нас один, вокруг "присваивания" всегда пробелы ставит - говорит, лучше видно..
x = 0Так ведь лучше читается.
А вот так уже извратно:
doSmth( param1, param2 )или
for ( i = 0; i < n; i++ ) ...
Типа вы его лошите за это, так?
Правильно говорит. Чем больше пространства - тем лучше. В разумных пределах, конечно.
Между прочим то что ты назвал извратным - очень удобно.

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

Потом, должна спасать подсветка.


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



Давайте для мозга дривер токенизации заинсталлим?


ае

Видишь ли, помимо повышения наглядности токенизации у системы оформления кода есть ещё несколько целей. Например, облегчение восприятия логической структуры. Использовать дополнительные пробелы и там и там невозможно, а твой + на самом деле является оператором | (вот, кстати, пример неудачного оверлоада так что пробелы после скобочек это бесполезная трата возможностей устройства вывода.
if (a + (b * d) < 0) // right
if ( a + ( b * d ) < 0 ) // wrong
if ( ( a + ( b * d ) ) < 0 ) // ваще пиздец wrong
А учитывая фактор лени:
if(a+(b*d)<0)// left : )
if ( a + (b * d) < 0 )
Я же не говорю что пробелы надо ставить везде. Пробела перед второй скобкой и после третьей скобки вполне достаточно для изложенной мной цели.
Реально после if и т.п никогда пробел не ставлю.
Фигня. Ограниченность зрения - вещь куда более серьёзная. Если строчка длинная (из-за пробелов, в частности то глазу при чтении нужно делать больше остановок. Не все владеют техникой быстрого чтения и накаченной мышцей периферического зрения.
Ведь не пишут y = f( x )
А вот за это готов душить собственными руками. if и for всё-таки не функции.
Я так пишу.

Я имею в виду на бумаге.
Какая нафиг токенизация... Проблема пробелов в коде - это фигня по сравнению с проблемой почерка врачей.
Если учесть, что двоеточие в паскале в блоке не встречается больше нигде и явно бросается в глаза - считаю пробелы излишними.
ConceptId := LingFormConceptList.ResultDataSet['ConceptId'];
CardConcepts.Append;
CardConcepts['CardId'] := CardId;
CardConcepts['CardMessageId'] := CardMessageId;
CardConcepts['ConceptId'] := ConceptId;
CardConcepts['Rank'] := 1;
CardConcepts['IsAmbigous'] := false;
CardConcepts['IsManual'] := true;
CardConcepts['Status'] := 1;
CardConcepts['SessionIdEnt'] := CurrUsr.SessionId;
CardConcepts['SessionId'] :=CurrUsr.SessionId ;
CardConcepts.Post;
Еще бы неплохо пробелы в [] ставить. А так очень хорошее форматирование.
Типа хотя бы
CardConcepts := (
'CardID' = CardID,
(* ... *)
'SessionID' = CurrUsr.Session.ID,
);
CardConcepts.Post;
Даже в модуле-2 при всём как-бы паскальном синтаксисе сделали немножко изменений (каких именно - не помню после чего это всё стало логичней.
Менеджеры дельфей были сильно неправы, когда взяли базовый паскаль за основу, имхо.
Какая разница? Разве C++Builder не такой же, но с фигурными скобками?
Между чем и чем?
Какая разница, какой синтаксис в Дельфи, если ты можешь использовать Билдер?
меж билдером и дельфой - никакой - VCL.
Мы вообще-то тут о синтаксе и оформлении кода говорим. Это я так, намекаю.
А что ты думаешь про то, куда ставить фигурную скобку в С-подобных языках?
и
for(i=0;i<size;i++) {
if(i<size-1) B[i]=M[i+(i+1)*size];
A[i]=M[i+i*size];
}
второй код хоть и длиннее - зато нагляднее и имхо проще найти парные скобки.
for(i=0;i<size;i++)
{
if(i<size-1) B[i]=M[i+(i+1)*size];
A[i]=M[i+i*size];
}
И ещё - нужны ли табуляции (типа везде для лесенки пользуем табы, только сетку выставляем не по 8, а кому как нравится)? Или вся лесенка должна быть на пробелах
И сам язык гораздо правильнее, чем С. хотя бы тем, что в нём можно жить без указателей.
А про фигурные скобки и бегин-энды это ваще полный бред - при скорости набивания среднего программиста это не является определяющим фактором.
Так что прекратим холивар.
Про фиг.скобки не сюда. На пробелах.
Но в данном случае with был использован констркуцией выше, и ещё раз выше. тут был бы третий вложенный with - не хотелось бы вносить путаницы.
with A do
begin
B:=...
C:=...
D:=..
end;
/***************************************************************************
* *
* begin : Fri Jan 7 23:13:54 2005 *
* copyright : (C) 2004 by Samokhvalov Anton <mail.ru> *
* *
***************************************************************************/
#include <Master.h>
#include <sched.h>
#include "Job.h"
#include "Storage.h"
#include "Debug.h"
class Exit: public IRun
{
public:
Exit( Storage* s ):
d_s( s )
{
}
override void run throw
{
try
{
d_s->cleanup;
}
catch ( const std::exception& e )
{
Debug::write( 3, "%s\n", e.what );
}
catch ( const Exception& e )
{
Debug::write( 3, "%s: %s\n", e.type e.description );
}
exit( 0 );
}
protected:
virtual ~Exit throw
{
}
private:
Storage* d_s;
};
Job::Job( Storage* s, const std::string& url, size_t first )
throw ( std::exception ):
d_storage( s
d_url( url
d_first( first )
{
}
Job::~Job throw
{
}
void Job::run throw
{
Debug::write( 1, "url %s started\n", d_url.c_str );
size_t current_brick = d_first;
char buf[ BlockFile::blockSize ];
while ( true )
{
std::auto_ptr<Master> master( new Master );
try
{
master.get->open( d_url );
if ( master.get->size != d_storage->getSize )
{
Debug::write( 1, "url %s points to file with different size\n",
d_url.c_str );
d_storage->setBadUrl( d_url.c_str );
return;
}
master.get->seek( off_t)current_brick)*BlockFile::blockSize );
while ( true )
{
const size_t readed = master.get->read(
buf, d_storage->brickSize( current_brick ) );
//indicates that we are not locked
//storage->touch;
d_storage->writeBrick( current_brick, buf );
try
{
size_t last = current_brick;
current_brick = d_storage->requestBrick( current_brick );
if ( current_brick != last + 1 )
{
master.get->seek( off_t)current_brick)*BlockFile::blockSize );
}
}
catch ( AllDone )
{
try
{
d_storage->cleanup;
}
catch ( const std::exception& e )
{
Debug::write( 3, "%s\n", e.what );
}
catch ( const Exception& e )
{
Debug::write( 3, "%s: %s\n", e.type e.description );
}
exit( 0 );
}
sched_yield;
}
}
catch ( const MasterException& me )
{
switch ( me.getError )
{
case Slave::None:
case Slave::ConnectionBroken:
case Slave::CannotConnect:
sleep( 1 );
break;
case Slave::BrokenUrl:
Debug::write( 1, "url %s broken\n", d_url.c_str );
d_storage->setBadUrl( d_url.c_str );
return;
default:
Debug::write( 3, "%s\n", me.getErrorDescription );
return;
}
}
catch ( const Exception& e )
{
Debug::write( 3, "%s: %s\n", e.type e.description );
return;
}
}
}
Сам-то понял что сказал?
> И сам язык гораздо правильнее, чем С. хотя бы тем, что в нём можно жить без указателей
В жаве и шарпе тоже. Мы о синтаксисе.
>при скорости набивания
Мы не о скорости набивания, а о скорости чтения.
>Так что прекратим холивар
Ок, прекращай. =)
> Сам-то понял что сказал?
Ты бы хоть по Яndex-у пробил незнакомый термин, прежде чем наезжать.
http://en.wikipedia.org/wiki/Context-free_grammar
А если A имеет A['x1'], A['x2'], ... , как в твоём примере?
А паскаль - это вообще неправильный язык, и основная его неправильность - в отсутствии логичного стиля.Описание синтаксиса компонентного паскаля (это который появился после Оберона-2) в EBNF умещается на одну страницу. "Логичный стиль" там продуман очень хорошо. Синтаксис обычного паскаля не очень сильно от него отличается.
> И сам язык гораздо правильнее, чем С. хотя бы тем,
> что в нём можно жить без указателей
Половина моей любви к Си - указатели.
2:
> TTT*BBB
Простите, башку оторвать кодеру за такие имена.
> Кстати, скорость чтения/понимания в паскале выше. именно,
> из-за begin/end, then, var, type и т.п.
Это довод типа "ничто". В сях никаких проблем по пониманию { } и объявлений переменных.
Немного оффтоп:
Сказать, почему я не засчитал одному студенту такую программу:
?
char c;
FILE *fp=fopen("a.dat","r");
int mas[256];
while(!feof(fp
{
ch=fgetc(fp);
mas[ch]++;
}
Этот гад fclose забыл!
Угадай, что она напечатает? без компилятора!
#include <stdio.h>
int main
{
char ch;
FILE *fp=fopen("a.c","r");
int mas[256];
int x=100;
while(!feof(fp
{
ch=fgetc(fp);
mas[ch]++;
}
fclose(fp);
printf("%d\n",x);
return 0;
}
По типу &x == mas-1 ?
И это очень печально. никакие range-check здесь не спасают
Прогу надо пропатчить инструкцией после цикла: mas=&x+..;
Но вообще такой поход к делу - это лол. Печальный лол.
Так в чем проблема? А то не все на С прогают?
например, за
сразу незачот - ибо fgetc возвращает int, и сравнивать ch на EOF смысла нет - он завалится на 'Ъ' в koi8 и 'я' в win1251.
char ch;
...
ch=fgetc(fp);
PS: хотя могу предположить что портится переменная х. И кстати как она портится - зависит от LE/BE. Могу предположить что на моей машине будет 101

а изменился он тут:
mas[-1] по адресу совпадает с x
ch=fgetc(fp);
mas[ch]++; // ch==-1 когда достигнут конец файла
это здесь всего три строчки, где стоит ловить, когда не в свою память залезли. А если проект на 100К строк?
проверено на gcc (в классах на ММ 13-15, 13-16, 13-07, 13-08, v3.4) и MSVC 6.0 (cl v12.00.8168)
char знаковый?
в одном из пред. постов я написал, что char использовать в данном случае вообще некорректно. поэтому int картины не меняет
т.е. fgetc может возвращать отрицательные числа или большие 255?
Сразу заботиться об этом надо.
You shouldn't make mistakes anyway, it is a waste of time.
вот что говорит MSDN:
fgetc and _fgetchar return the character read as an int or return EOF to indicate an error or end of file. fgetwc and _fgetwchar return, as a wint_t, the wide character that corresponds to the character read or return WEOF to indicate an error or end of file. For all four functions, use feof or ferror to distinguish between an error and an end-of-file condition. For fgetc and fgetwc, if a read error occurs, the error indicator for the stream is set.EOF в char не помещается. следовательно - он где-то за пределами. Где именно - зависит от реализации.
Объясни, в чём дело, пожалуйста. Я уж и BC31 достал из детских запасов, и разные файлы проверял - всё время пишет 100.

но
f(x);
Это позволяет визуально отличить одно от другого. 70 постов я не осилил, так что извиняйте, может это уже было.
if (x)
...
while (x)
...

пробел после скобкиНу ладно, набрал уже, жалко выбрасывать

А что, ничего приличнее BC31 не нашлось? Под дос очень модно на ваткоме было писать - DOS4GW, 32 битная арифметика, вся память, быстро, просто надёжно..
А в чём ошибка всё-таки?
Незачот.
Любой уважающий себя экзаменатор даже после незачёта скажет, какой ответ правильный и почему.
1) использовать char ch; ch=fgetc; некорректно
2) опрометчивый цикл
3) У студента был довод "Ну ведь работает же!" - на что мне пришлось доказывать, что не работает.
while(!feof(fp
{
ch=fgetc(fp);
//Здесь должна быть проверка на конец файла
mas[ch]++; // из-за отсутствия предыдущей проверки здесь может произойти mas[-1]++;
}
4) чтобы доказать неправильность этого куска мне пришлось ввести доп. переменную (х которая "ни с того, ни с сего" меняет значение. почему не работает с ВС31 - хз. я сейчас посмотрел ассемблеровский вывод и нихрена в нём не понял - gcc выдаёт более понятный асм. к тому же ВС почему-то у меня сильно тормозит машину.. фтопку этот компилятор.
надо иметь в виду, что sizeof(int)=2
вот фрагмент:
#include <stdio.h>
int main
{
int ch;
FILE *fp=fopen("a.c","r");
int mas[256];
int x=100;
while(!feof(fp
{
ch=fgetc(fp);
mas[ch]++;
}
printf("%d\n",x);
return 0;
}
;
; int mas[256];
; int x=100;
;
?debug L 8
mov word ptr [bp-8],100
jmp short @86
@58:
;
; while(!feof(fp
; {
; ch=fgetc(fp);
;
?debug L 11
push word ptr [bp-4]
push word ptr [bp-6]
call near ptr _fgetc
pop cx
pop cx
mov word ptr [bp-2],ax
;
; mas[ch]++;
;
?debug L 12
mov bx,word ptr [bp-2]
shl bx,1
lea ax,word ptr [bp-520]
add bx,ax
inc word ptr ss:[bx]
@86:
?debug L 9
les bx,dword ptr [bp-6]
test word ptr es:[bx+2],32
je short @58
Выходит, у меня в винде никто нолик в конце текстового файла просто не ставит, ибо нафиг?
D:\Bc31\A.C DOS 231 Col 0 100%
0000000000: 23 69 6E 63 6C 75 64 65 │ 20 3C 73 74 64 69 6F 2E #include <stdio.
0000000010: 68 3E 0D 0A 0D 0A 69 6E │ 74 20 6D 61 69 6E 28 29 h>♪◙♪◙int main
0000000020: 0D 0A 7B 0D 0A 09 63 68 │ 61 72 20 63 68 3B 0D 0A ♪◙{♪◙○char ch;♪◙
0000000030: 09 46 49 4C 45 2A 20 66 │ 70 20 3D 20 66 6F 70 65 ○FILE* fp = fope
0000000040: 6E 28 22 61 2E 63 22 2C │ 20 22 72 22 29 3B 0D 0A n("a.c", "r");♪◙
0000000050: 09 69 6E 74 20 6D 61 73 │ 5B 32 35 36 5D 3B 0D 0A ○int mas[256];♪◙
0000000060: 09 69 6E 74 20 78 20 3D │ 20 31 30 30 3B 0D 0A 0D ○int x = 100;♪◙♪
0000000070: 0A 09 77 68 69 6C 65 20 │ 28 21 66 65 6F 66 28 66 ◙○while (!feof(f
0000000080: 70 29 29 0D 0A 09 7B 0D │ 0A 09 09 63 68 20 3D 20 p♪◙○{♪◙○○ch =
0000000090: 66 67 65 74 63 28 66 70 │ 29 3B 0D 0A 09 09 6D 61 fgetc(fp);♪◙○○ma
00000000A0: 73 5B 63 68 5D 2B 2B 3B │ 0D 0A 09 7D 0D 0A 0D 0A s[ch]++;♪◙○}♪◙♪◙
00000000B0: 09 66 63 6C 6F 73 65 28 │ 66 70 29 3B 0D 0A 0D 0A ○fclose(fp);♪◙♪◙
00000000C0: 0D 0A 0D 0A 09 70 72 69 │ 6E 74 66 28 22 25 64 5C ♪◙♪◙○printf("%d\
00000000D0: 6E 22 2C 78 29 3B 0D 0A │ 09 72 65 74 75 72 6E 20 n",x);♪◙○return
00000000E0: 30 3B 0D 0A 7D 0D 0A │ 0;♪◙}♪◙
1Help 2Unwrap 3Quit 4Text 5 6Edit 7Search 8Win 9 10Quit
Ахтунг! Текстовый скриншот винды!
Где-то я слышал, что в MySQL AB code style принят такой: a= b (после a пробела нет). Они говорят, что так борются с какими-то ошибками-опечатками.
после мнемоники должен быть таб - иначе это ересь, а не асм

Ачтойта? Я только schroedinbug, Bohr bug, mandelbug и heisenbug знаю...
Да, пойнтеры могут привести к Последствиям. Поэтому я и прогаю на шарпе.
С другой стороны язык в котором нет массивов, строк и прочей высокоуровневой фигни на уровне синтаксиса чем-то прекрасен. Ортогонален и всё такое.
Именно поэтому за использование char * (вместо string или другой настоящей строки) в якобы высокоуровневой проге надо сразу стрелять на месте, и любые рассуждения на тему более или менее безопасного их использования это бред сивой кобылы. ИМХО. Да, а преподавателей, которые не считают нужным (или сами не знают) разъяснить обучаемым, что char * это НЕ строка, неплохо бы за что-нибудь подвешивать =)
А вообще на сях нужно писать драйвера и прочие тайм-критикал куски кода. Для остального лучше использовать другие языки с прекрасным С-шным синтаксисом - жаву или шарп.
char вообще-то signed, поэтому _любой_ символ с кодом выше 127 (например русская буква) пролетит мимо массива =) Студентам С преподаешь, да? Мило, мило.
Драйвера, IMHO, лучше присать на С++ -- можно какой-нибудь фреймворк замутить, там много однотипного. Ядро еще можно, там разницы нет никакой, в первую очередь думают, потом пишут, главное прозрачность и читабельность, что б не надо было по темплейтам прыгать аля STL. Всякию другою хрень, вроде численых методов и проч., лучше тоже на С++.
совсем не обязательно
Да. Но как правило всё-таки signed.
Ещё раз, char ch - там некорректен! правильно писать int ch. за это первый незачОт, ибо - хрен с ними, с русскими символами. а вот если будет буква 0xFF, которая в некоторых кодировках очень даже нормальная, то при сравнении char, который 0xFF (signed) с EOF получится истина.
второй незачот выделен красным.
Да, и чем же char * НЕ строка? Или ты знаешь в С другой способ оперировать с текстовыми строками?
// про асм - это выдача BC31
AmountMST postPennyDiff(DiscAmount _mSTDiffCur,
AmountMST _mSTDiffMST,
Amount _exchRate,
CustVendTrans _custVendTrans,
TaxAmount _taxAmount = 0)
{
LedgerAccount pageAccount;
TaxAmount taxSettled;
// EGLA, Correspondence II -->
LedgerBondClient_RU ledgerBondClient;
LedgerBondVRefId_RU sumAccountVRefId;
// EGLA, Correspondence II <--
CustVendTrans mSTDiffTrans = _custVendTrans.data;
;
postingProfile = _custVendTrans.postingProfile;
mSTDiffTrans.clear;
mSTDiffTrans.accountNum = _custVendTrans.accountNum;
mSTDiffTrans.transDate = transactionDate;
mSTDiffTrans.voucher = ledgerVoucher.lastVoucher;
mSTDiffTrans.approved = NoYes::Yes;
mSTDiffTrans.txt = transactionTxt.txt;
mSTDiffTrans.closed = mSTDiffTrans.maxSettlementDate(transactionDate);
mSTDiffTrans.currencyCode = _custVendTrans.currencyCode;
mSTDiffTrans.amountCur = _mSTDiffCur;
mSTDiffTrans.amountMST = _mSTDiffMST;
mSTDiffTrans.settleAmountCur = mSTDiffTrans.amountCur;
mSTDiffTrans.settleAmountMST = mSTDiffTrans.amountMST;
mSTDiffTrans.lastSettleVoucher = _custVendTrans.voucher;
mSTDiffTrans.lastSettleDate = transactionDate;
mSTDiffTrans.closed = transactionDate;
mSTDiffTrans.dimension = _custVendTrans.dimension;
//Valu -->
mSTDiffTrans.RcontractCode = _custVendTrans.RcontractCode;
mSTDiffTrans.RContractAccount = _custVendTrans.RContractAccount;
//Valu <--
mSTDiffTrans.initFromPostingProfile(postingProfile);
this.reverseAmounts(mSTDiffTrans);
mSTDiffTrans.insert;
this.createLedgerVoucherTrans(_custVendTrans,this.mstDiffTxtLedger;
//Valu -->
ledgerBondClient = ledgerVoucher.findLedgerVoucherObject.ledgerBondClient_RU;
if (ledgerBondClient.currentLogLength== 0)
{
_taxAmount = 0;
}
ledgerVoucher.addTrans(
LedgerVoucherTransObject::newCreateTrans(
ledgerVoucher.findLedgerVoucherObject
LedgerPostingType::MSTDiff,
mSTDiffTrans.sumAccount
_custVendTrans.dimension,
companyInfo::standardCurrency
mSTDiffTrans.amountMST,
mSTDiffTrans.recId;
// EGLA, Correspondence II -->
if (ledgerBondClient)
{
sumAccountVRefId = ledgerBondClient.lastVRefId;
}
// EGLA, Correspondence II <--
if (abs(_mSTDiffMST) <= this.maxMSTDiff
{
pageAccount = LedgerSystemAccounts::accountNum(LedgerPostingType::MSTDiff);
}
else
{
pageAccount = this.cashDiscAccount(_custVendTrans);
if (!pageAccount)
{
switch (_custVendTrans.tableId)
{
case tableNum(CustTrans):
throw error(strFmt("@SYS24816",LedgerPostingType::CustCashDisc;
case tableNum(VendTrans):
throw error(strFmt("@SYS24816",LedgerPostingType::VendCashDisc;
}
}
}
if (_taxAmount < 0)
{
if (_taxAmount < -mSTDiffTrans.amountMST)
{
taxSettled = -mSTDiffTrans.amountMST;
}
else
{
taxSettled = _taxAmount;
}
}
else
{
if (_taxAmount > 0)
{
if (_taxAmount > -mSTDiffTrans.amountMST)
{
taxSettled = -mSTDiffTrans.amountMST;
}
else
{
taxSettled = _taxAmount;
}
}
}
if (mSTDiffTrans.amountMST + taxSettled)
{
if (abs(_mSTDiffMST) <= this.maxMSTDiff
{
ledgerVoucher.addTrans(
LedgerVoucherTransObject::newCreateTrans(
ledgerVoucher.findLedgerVoucherObject
LedgerPostingType::MSTDiff,
pageAccount,
_custVendTrans.dimension,
companyInfo::standardCurrency
-(mSTDiffTrans.amountMST + taxSettled
mSTDiffTrans.recId;
}
else
{
this.postPennyDiffOnCashDiscmSTDiffTrans.amountMST + taxSettled
_custVendTrans,
(_custVendTrans.amountMST * 100/ _custVendTrans.amountCur
custVendTransCredit);
}
}
// EGLA, Correspondence II -->
if (ledgerBondClient)
{
ledgerBondClient.bondVRef2Log(sumAccountVRefId);
ledgerBondClient.removeCurrentLogObject;
}
// EGLA, Correspondence II <--
if (ledgerVoucherCreated)
{
ledgerVoucher.end;
}
//Valu -->
this.createPostingTransLog_RU(CustVendTransPostingLogType_RU::PennyDifference,
mSTDiffTrans,
LedgerPostingType::MSTDiff,
mSTDiffTrans.sumAccount
pageAccount,
mSTDiffTrans.AmountMST,
0,
0,
mSTDiffTrans.dimension,
mSTDiffTrans.AmountCur,
_custVendTrans,
custVendTransCredit);
//Valu <--
return taxSettled;
}
и еще пробелами отделяться должны мелкие знаки типа +, =, чтобы было лучше видно аргументы этих операций
насчет пробела после названия функции - я обычно не ставлю, кроме if и for...
мне интересно, есть какой-нибудь стандарт форматирования кода, для c++/c# или java? где на него посмотреть можно..
Наверное к этому должна быть документация...
Еще от ошибок защищает установка константы слева от сравнения. Типа if (0 == var). Но так никто не делает, наверное потому, что некрасиво.
---
...Я работаю антинаучным аферистом...
char * - это указатель на char. Строка это то, для чего определена операция конкатенации.
>Или ты знаешь в С другой способ оперировать с текстовыми строками?
string (в С++) или свой враппер. Поскольку в С объектов нету, то враппер будет не вполне объектом на вид, но это неважно.
Да, массивов, кстати, в С тоже почти нету, нельзя же серьёзно считать запись 3[a] обращением к элементу массива, поэтому для массивов тоже нужно писать врапперы - с range checking и всё такое. ИМХО к программированию на С/С++ именно так нужно подходить, а все эти страшные ашибки как раз и возникают от того, что люди почему-то считают char * строкой и упорно не хотят терять немножко скорости на range checking в самописном array. Ну ладно, в критическом по скорости месте можно писать хоть на асме, но в прогах-то как правило 90% и больше - это управляющий, а не вычисляющий код, кому там скорость критична.
А если пойти ещё дальше, то придёшь к шарпу =)

>Но так никто не делает, наверное потому, что некрасиво
if (NULL == myVar) - красиво, я так делаю, M$ в dxSdk везде так делает.
>мне интересно, есть какой-нибудь стандарт форматирования кода, для c++/c# или java? где на него посмотреть можно..
я ссылку на рсдн давал.
> char вообще-то signedНе знаю что там по стандарту, а и в студии и в g++ ситуация вот такая
совсем не обязательно
#include <iostream>
void f(char c)
{
std::cout << "char" << std::endl;
}
void f(signed char c)
{
std::cout << "signed char" << std::endl;
}
void f(unsigned char c)
{
std::cout << "unsigned char" << std::endl;
}
int main
{
fchar)0);
fsigned char)0);
funsigned char)0);
}
[xenon andrei]$ ./charТак что char - это просто char, странно что для него вообще < > определены. По хорошему надо было только == оставить.
char
signed char
unsigned char
B. Eckel, "Thinking in Java":
The value of standardization is that it takes less brain cycles to parse the code, so that you can focus more on what the code means.

Но точно знаю, что есть рекомендации Microsoft по форматированию кода для своих программистов. Наверное, можно им следовать.
Думаю. что и для разных других языков, которые этот документ не затрагивает, можно найти классическую книжку и посмотреть, как они там код форматируют.
The three types char, signed char, and unsigned char
are collectively called the character types. The
implementation shall define char to have the same range,
representation, and behavior as either signed char or
unsigned char.*)
*) CHAR_MIN, defined in <limits.h>, will have one of the
values 0 or SCHAR_MIN, and this can be used to
distinguish the two options. Irrespective of the choice
made, char is a separate type from the other two and is
not compatible with either.
если речь идет о джаве, то можно положиться на коды примеров из tutorial. в си(++ я полагаю, можно пользоваться той же договоренностью. в любом случае just keep it readable!

sure. no doubts. but that's too general for the thread. i preferred to be a bit more specific.

а можешь еще раз эту ссылку привести?
http://www.rsdn.ru/article/mag/200401/codestyle.XML
но там тоже нет ничего про пробел после скобки :-(
я нашел только эту: но там тоже нет ничего про пробел после скобки :-(
Оставить комментарий
otvertka07
я сам не ставю, но вот один программер в нашей конторе ставит, и меня это раздражает, я его код не могу читать