nakalilito C pahayag

S

sawaak

Guest
Hi,
dito ay isang programa.
Code:

magpawalang-bisa pangunahing ()

(

isang int = 10;

int b;b = (a - - isang a);

printf ( "halaga ng b ay% d", b);b = isang b;

printf ( "Ngayon halaga ng b ay% d", b);

)
 
Hi,
Mula sa code, nakita namin na mayroon kaming dalawang prefixs sa isang incrementing at isa-post ng maayos sa incrementing a.Kaya batay sa mga ito ayusin ang post ay incremented matapos b ay itinalaga ang halaga.Kaya unang halaga ng b ay 10-11 11 = 10.
Ngayon ay incremented dahil sa postfix.isang = 11.kaya bagong halaga ng b ay 21.
Pagbati,
ramana

 
said:

ano ito boils down sa bilang ramana_k22
said:
Halimbawa
isang = 10; b = 0;
isang ng => 10 10 = 20 at pagkatapos ng isang ; isang = 11;
isang ng => 11 11 dahil ang unang isang , at pagkatapos ng isang a;

 
Oo, maaari mong gusot sa pamamagitan ng pagpapaliwanag ng mga equation.Ngunit ito ay isang halimbawa ng isang napaka-seryosong problema sa pamantayan C, ito ay hindi pare-pareho ng pamantayan.Ang mga manunulat ng C compiler ay pinapayagan ang mga pakinabang ng pagbuo ng code para sa mga pahayag sa kahit anong ayos pinili nila hangga't ang pagkakasunod-sunod ang code ay nabuo sa ay sa parehong antas ng priority.

Nangangahulugan ito na ang x = a b c maaaring maging sanhi ng compiler upang lumikha ng code para saor x = a (b c)x = (a b) c
o x = isang (b c)Ito ay nangangahulugan na ang mga pre at post ng pagbabawas ng code sa lahat ng napupunta sa impiyerno kasama ang mga programa na gumagamit ng mga tulad code.Unang tuntunin ng hinlalaki kapag gumagamit ng C code - gamitin malinaw parenthises na magbigay ng compiler malinaw na tagubilin sa kung paano gumawa ng code, kasama ang nakakainis ang code ng isang daang beses na mas nababasa sa amin ang mga tao.Bottom line, kung isulat mo tulad ng hindi siguradong code na kailangan mo para malaman kung paano gumawa ng mga ito ng hindi malabo.

Ito ay sa parehong paraan na ang ilang mga tao na kumuha ng null na zero sa C. Ito ay hindi zero.Ang Kapitolyo titik ay dapat sabihin sa iyo na ito ay isang 'define'd pare-pareho.Ito ay ang halaga ng mga manunulat ng C compiler pipili na ng isang hindi wastong vanturo.Para sa karamihan ng pagpapatupad ng C compiler, ito ay 0, ngunit para sa ilan sa pagpapatupad, maaaring ito ay ang exception vestor o bitag vector para sa mga Hindi naka-assign vanturo.

Lesson so far: hindi ipaalam sa iyong code ay hindi siguradong, hindi mo maaaring gamitin ang parenthesis sapat na upang gawin itong hindi malabo.Ito ay makakatulong sa iyong karera-path napakalaki.

PS - Dapat mong makita ang mga loko epekto ang tukuyin ang mga pahayag ay maaaring maging sanhi kung hindi mo maglagay ng panaklong sa paligid ng walang pasubali ang lahat ng bagay, at sabihin ko ang lahat ng bagay.Ang ilan sa mga epekto ay isip-boggling.Ito ay isa sa mga dahilan kung bakit ang tukuyin ang mga pahayag ay sa mga ito ay paraan upang pagkapatay sa C .Compiler at pre-processors talagang hindi co-umiiral lutung-sama-sama.

 
Walang problema tulad ng sa karaniwang C.Ito sabi ng isang expression ay hindi pinapayagan na baguhin ang isang variable na higit sa isang beses sa pagitan ng pagkakasunod-sunod na puntos.

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

Ang pahayag na b = (a - - isang a);
na lumabag sa patakaran, kaya ang mga resulta ay hindi maliwanag (anumang bagay na maaaring mangyari).Upang gamitin ang mga code na ito sa iyong programa ay isang bug, kahit na ito ay nagbibigay sa iyo ang mga resulta na iyong inaasahan.

Lahat ng C programmer dapat basahin ang comp.lang.c FAQ.Ito ay nakaimpake na may mahusay na nagbibigay payo, kabilang ang mga paksa sa kasalukuyan kami ay pagtalakay.

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

Ako din inirerekomenda ang paggamit ng isang mas modernong compiler kaysa sa Turbo C. Kapag ako maglista sa halimbawa sa MinGW, ang kanyang babala na makilala ng mga mensahe ng ilang mga bugs, kasama na ang isa sa kasalukuyan kami ay discussing:

confusing.c: 2: babala: bumalik uri ng 'main' ay hindi `int 'confusing.c: Sa function `pangunahing ':confusing.c: 6: babala: operasyon sa `isang 'ay maaaring hindi tiyakconfusing.c: 6: babala: operasyon sa `isang 'ay maaaring hindi tiyakconfusing.c: 7: babala: walang pasubali deklarasyon ng function `printf '
 
echo47 wrote:

Walang problema tulad ng sa karaniwang C.
Ito sabi ng isang expression ay hindi pinapayagan na baguhin ang isang variable na higit sa isang beses sa pagitan ng pagkakasunod-sunod na puntos.
violates that rule, so the results are undefined (anything could happen).
Ang pahayag na b = (a - - isang a);
na lumabag sa patakaran, kaya ang mga resulta ay hindi maliwanag (anumang bagay na maaaring mangyari).
Upang gamitin ang mga code na ito sa iyong programa ay isang bug, kahit na ito ay nagbibigay sa iyo ang mga resulta na iyong inaasahan.Lahat ng C programmer dapat basahin ang comp.lang.c FAQ.
Ito ay nakaimpake na may mahusay na nagbibigay payo, kabilang ang mga paksa sa kasalukuyan kami ay pagtalakay.
<img src="http://www.edaboard.com/images/smiles/icon_wink.gif" alt="Wink" border="0" />
h ** p: / / c-faq.com / [/ url]Ako... pasubali deklarasyon ng function `printf '
 
HI,

Sa pahayag na ito b = (a - - isang a);
'isang' halaga ay incremented isang oras at decremented isa oras dahil sa mga unlapi-unlad at ang halaga ay 10.isang ay 10 na walang pagbabago sa ang halaga dahil sa postfix paglakas operator at matapos na ang pagpapatupad ng mga pahayag sa itaas ang halaga ng 'isang' ay 11.Ngayon, sa unang printf ang halaga ay 10 at sa susunod na pahayag printf ang halaga ng 'b' ay 21.

 
aandavan, ito ay ipinahihintulot na para sa isang compiler upang kumilos na paraan, ngunit hindi umaasa sa mga ito.

.

Ang C standard na sinasabi ang mga resulta ay hindi maliwanag.
 
Hi ech047,
Checked ko na may dalawang compiler TurboC at mahaba turbo C. nakuha ko ang parehong sagot.Atipan ng pawid kung bakit ko naisip ang lahat ng mga compiler ay gumawa ng katulad na resulta.Subalit sa keil sagot ay naiiba.Kaya Kinukumpirma ko na ang halaga ay depende sa compiler

 
Iminumungkahi ko sa inyo sundin ang mga patakaran ng MISRA kapag pagsulat ng code.Ito ay isang pagsisikap sa pamamagitan ng industriya ng motor sumulat ng code na dapat gawain sa lahat ng compiler.

 
Ano ang MISRA?Kung nais mong isulat ang magandang portable C code, sundin ang mga ISO / IEC / C Ansi Standard, hindi sa ibang set ng mga tuntunin, at hindi pag-uugali ng ilang compiler's.

C.

Of course, ang standard na ito ay hindi tunay mabuti para sa pag-aaral ng
C.

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

Update:

natuklasan ko na MISRA (ang Motor Industry Software PAGIGING Association)-publish ng "Patnubay para sa Paggamit ng Wika ng C sa kritikal Systems".Libro na nagsasabing gamitin ang C lamang gaya ng nilinaw sa standard na ISO, at pagkatapos ay nagdadagdag ng karagdagang mga kinakailangan upang makatulong sa programista maiwasan ang mga karaniwang pagkakamali C.Iyan tulad ng isang magandang bagay!
Huling na-edit sa pamamagitan ng echo47 sa Oktubre 28, 2006 6:51; edited 1 time in total

 
U ay hindi dapat gamitin ang ganoong uri ng mga code sa C..Pagpapatupad nito ay hindi maliwanag sa C wika.Ang mga resulta ay maaring varry mula sa compiler sa compiler.

 
Gumamit ng parenthesis .. na gumawa ng mas madali at mas malinaw na para sa u at para sa mga taong basahin ang iyong code .. at para sa mga compiler!

Sa ganitong paraan ng writting ang code .. iba't-ibang compiler ay magbibigay sa u iba't-ibang mga sagot!

 
ang sagot ay simple

Unang assignment ...10 -11 11 nagbibigay ng mga 10

Ngayon A = 11 at B = 10
kaya, A B = 11 10 = 21

ito muli ay depende sa compiler at siyempre, kaunti mahirap i-debug
Huwag gumamit ng tulad ng isang coding sa programa
Gumamit ng parenthesis para sa paghihiwalay

 
Ito ay isang magandang ideya na gawin static na pagtatasa sa iyong code, ang paggamit ng isang bagay tulad ng Gimpel lint.Gimpel din ang supply ng isang file MISRA checking rin.Gusto ka mabigla kung gaano karaming bugs ay maaaring napansin sa pamamagitan ng static analysis!
Sa automotive industriya, ang software ay dapat MISRA sang-ayon.
MISRA ay masyadong maselan ang tungkol sa mga uri!

 

Welcome to EDABoard.com

Sponsor

Back
Top