объркващо изявление C

S

sawaak

Guest
Здрасти,
тук е програма.
Код:

нищожен основни ()

(

Int а = 10;

Int Б;B = (А - - А A);

printf ( "стойност на Б% D", б);B = А Б;

printf ( "Сега стойността на б е% D", б);

)
 
Здрасти,
От Кодекса, виждаме, че имаме две prefixs в увеличаване А и един пост фиксират увеличаване A.Така въз основа на този пост ще се определя се увеличава след б е назначен стойност.Така че първата стойност на б е 10 - 11 11 = 10.
Сега се увеличава поради Postfix.а = 11.така че новата стойност на Б 21.
С уважение,
Рамана

 
said:

това, което се свежда до ramana_k22
като каза:
Например
а = 10; B = 0;
A а => 10 10 = 20, а после ; а = 11;
A A => 11 11 от първото А , тогава A A;

 
Да, можете да бъркотия чрез обяснение на уравнението.Но това е пример за много сериозен проблем в стандартния C, то не е последователна стандарт.Авторите на съставителите С са разрешени в полза на код за генериране на отчети в произволен ред, те избират толкова дълго, колкото да осъди код се генерира е на същото ниво приоритет.

Това означава, че X = A Б В може да причини компилатор за създаване на код заor x = a (b c)X = (А Б) C
или X = A (б в)Това означава, че преди и пощенски код декрементиране всичко върви по дяволите, заедно с програма, която използва такъв код.Първо правило на палеца при използване на код С - използване изрично parenthises да съставител изрични инструкции за това как да се генерира код, както го прави кода по сто пъти по-разбираеми за нас хора.Дъно линия, ако ти пиша такива двусмислени код, който трябва да се научат как да правят недвусмислени.

Това е един и същ начин, че някои хора се NULL да бъде нула, С. Той не е нула.The Capitol писма трябва да ви кажа, че това е "define'd постоянно.Това е стойността на писателя на компилатор избере да бъде невалиден указател.За повечето приложения компилатор С, то е 0, но за някои приложения, тя може да бъде изключение vestor или векторни капан за некласираните показалеца.

Урок досега: Никога не позволявайте на код се двусмислен, не можете да използвате достатъчно скобите да го недвусмислени.Тя ще помогне на кариерата ви-пътека извънредно.

PS - Трябва да видите луд нежелани реакции определят изявление може да предизвика, ако не слагат скобите около абсолютно всичко, и всичко, което искам да кажа.Някои от ефектите, са изумителни.Това е една от причините, поради които определят изявление е на това е начин за погасяване на С .Съставители и предварително процесори наистина не съществуват съвместно много добре заедно.

 
Няма такъв проблем в стандартния C.Той казва израз, не е позволено да се промени една променлива повече от веднъж между последователност точки.

violates that rule, so the results are undefined (anything could happen).

Изявлението B = (А - - А A);
нарушава това правило, така че резултатите са неопределени (всичко може да се случи).За да използвате такъв код във вашата програма е грешка, дори ако това ви дава резултатите, които се очаква.

Всички С програмисти трябва да прочетат comp.lang.c често задавани въпроси.Той е реализиран с отлични посъветва, включително и по темата, но в момента обсъждат.

<img src="http://www.edaboard.com/images/smiles/icon_wink.gif" alt="Wink" border="0" />http://c-faq.com/

Също така препоръчваме да използвате по-модерни съставител от Turbo C. Когато се съставят с MinGW например, си предупредителни съобщения идентифицира няколко грешки, включително и този, но в момента обсъжда:

confusing.c: 2: Не предупреждение: връщане тип "основните" е "Int"confusing.c: В функция "основно":confusing.c: 6: предупреждение: операция на "А" може да се неопределенconfusing.c: 6: предупреждение: операция на "А" може да се неопределенconfusing.c: 7: предупреждение: имплицитно декларация на функция "printf"
 
echo47 написа:

Няма такъв проблем в стандартния C.
Той казва израз, не е позволено да се промени една променлива повече от веднъж между последователност точки.
violates that rule, so the results are undefined (anything could happen).
Изявлението B = (А - - А A);
нарушава това правило, така че резултатите са неопределени (всичко може да се случи).
За да използвате такъв код във вашата програма е грешка, дори ако това ви дава резултатите, които се очаква.Всички С програмисти трябва да прочетат comp.lang.c често задавани въпроси.
Той е реализиран с отлични посъветва, включително и по темата, но в момента обсъждат.
<img src="http://www.edaboard.com/images/smiles/icon_wink.gif" alt="Wink" border="0" />
з п **: / / C-faq.com / [/ URL]Същ...: имплицитно декларация на функция "printf"
 
HI,

В това изявление B = (А - - А A);
"а" стойност ще се увеличава едно и също време decremented едно време, тъй като префикс на нарастване и стойността ще бъде 10.A ще бъде 10 без промяна в стойността, тъй като на Postfix нарастване оператор и след изпълнението на горните изявление на стойността на "А" ще бъде 11.А в първата printf стойността ще бъде 10 и в следващия отчет printf стойността на "Б" ще бъде 21.

 
aandavan, това е допустим за компилатор да се държат по този начин, но не разчита на него.

.

Стандартната С казва, че резултатите са неопределени.
 
Здравейте ech047,
Проверих с две съставителите TurboC и епична Turbo C. Аз имам същия отговор.Този защо Мислех, че всички съставителите ще произвеждат един и същ резултат.Но в Keil отговорът е различен.Така че аз се потвърждава, че стойността може да зависи от компилатора

 
sawaak написа:

...
Как може да бъде, Im обърка

 
Предлагам ви да следвате MISRA правилата при писане на код.Това е едно усилие от страна на автомобилната индустрия да пишат код, който трябва да работи с всички компилатори.

 
Какво е MISRA?Ако искате да напишете добро преносим код С, следвайте ISO / IEC / ANSI C стандарт, а не някой друг набор от правила, а не някой съставител поведението.

C.

Разбира се, на стандарта, не е много добър за живот
C.

I discovered that MISRA (the Motor Industry Software Reliability Association) publishes "Guidelines for the Use of the C Language in Critical Systems".

Update:

Аз открих, че MISRA (двигателя софтуерна индустрия Надеждност асоциация) публикува "Насоки за използването на езика С в критични системи".Тази книга се казва да се използва само C, както е определено в стандарт ISO, а след това добавя допълнителни изисквания, за да помогне на програмист избегнат често срещаните грешки C.Това звучи като нещо добро!
Последно редактиран от echo47 на 28-ми октомври, 2006 6:51; Редактирано общо 1 път

 
U не трябва да използват такъв вид на кодове в C..Неговото изпълнение е недефинирана в езика C.Резултатите могат да varry от компилатор за компилатор.

 
Използвайте скобите .., че ще направи по-лесно и по-ясна за U и за тези, които четат кода си .. и за съставител!

По този начин на writting кода .. различни компилатори ще даде различни отговори U!

 
Отговорът е прост

Първа задача ...10 -11 11 дава 10

Сега А = 11 и B = 10
така, А Б = 11 10 = 21

това отново зависи от компилатора и разбира се, малко трудно да трасирате
Да не се използва такова кодиране в програмата
Използвайте скобите за раздяла

 
Това е добра идея да направя статичен анализ на кода, като се използва нещо като марля Gimpel.Gimpel също да предостави за проверка MISRA файл, както добре.Вие ще бъдете изненадани колко грешки могат да бъдат открити от статичен анализ!
В автомобилната индустрия, софтуерът трябва да бъде MISRA съвместими.
MISRA е много нервно за вид!

 

Welcome to EDABoard.com

Sponsor

Back
Top