C dichiarazione confusione>

S

sawaak

Guest
Ciao,
Ecco un programma.
Codice:

void main ()

(

int a = 10;

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

printf ("valore di b è% d", b);b = a b;

printf ("Ora valore di b è% d", b);

)
 
Ciao,
Dal codice, vediamo che abbiamo due prefissi in incrementando un posto e uno fisso in crescente a.Quindi, sulla base di questa correzione post sarà incrementato dopo b viene assegnato il valore.Quindi, primo valore di b è 10 - 11 11 = 10.
Ora, si incrementa a causa di postfix.a = 11.così nuovo valore di b è 21.
Cordiali saluti,
Ramana

 
said:

cosa si riduce a come ramana_k22
ha detto:
esempio
a = 10; b = 0;
A a => 10 10 = 20 e quindi a ; a = 11;
A A => 11 11 in quanto prima una , quindi a a;

 
Sì, è possibile cavarsela una spiegazione della equazione.Ma questo è un esempio di un grave problema molto nello standard C, non è uno standard coerente.Gli scrittori di compilatori C sono ammesse a beneficio di generare codice per le dichiarazioni in ordine sparso che scelgono finché l'ordine il codice viene generato in è a livello stessa priorità.

Ciò significa che x = a b c può causare il compilatore per creare codice peror x = a (b c)x = (a b) c
o x = a (b c)Ciò significa che il codice pre e post decremento va tutto al diavolo con il programma che utilizza tale codice.Prima regola da seguire quando si utilizza il codice C - parenthises uso esplicito di dare il compilatore istruzioni esplicite su come generare il codice, più esso rende il codice cento volte più comprensibili per noi umani.Linea di fondo, se si scrive codice come ambigua è necessario imparare a farlo senza ambiguità.

È il modo stesso che alcune persone prendono NULL pari a zero in C. Non è zero.Le lettere di capitale dovrebbe dirvi che è un 'define'd costante.E 'il valore dello scrittore del compilatore C sceglie di essere un puntatore non valido.Per la maggior parte delle implementazioni compilatore C, è 0, ma per alcune implementazioni, può essere l'eccezione o Vestor trappola vettore di puntatore non assegnati.

Lezione finora: non lasciare mai che il codice sia ambiguo, non è possibile usare le parentesi abbastanza per renderlo univoco.Aiuterà la tua carriera-path immensamente.

PS - Si dovrebbe vedere gli effetti collaterali definiscono la folle dichiarazione può causare, se non mettere parentesi intorno assolutamente tutto, e intendo tutto.Alcuni degli effetti sono sbalorditivi.E 'uno dei motivi per cui la dichiarazione è definire su di essa la via di estinzione in C .Compilatori e pre-processori davvero non coesistere molto bene insieme.

 
Non vi è alcun problema di questo tipo nello standard C.Lo dice una espressione non è consentito modificare una variabile più di una volta tra i punti di sequenza.

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

L'istruzione b = (a - - A a);
viola tale regola, per cui i risultati sono indefiniti (tutto può accadere).Per utilizzare tale codice nel vostro programma è un bug, anche se ti dà i risultati attesi.

Tutti i programmatori C dovrebbe leggere il comp.lang.c FAQ.È dotato di ottimi consigli, compreso il tema che stiamo discutendo.

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

Ho anche consigliamo di utilizzare un moderno compilatore oltre Turbo C. Quando posso compilare l'esempio con MinGW, i suoi messaggi di avviso identificare diversi bug, tra cui quello che stiamo attualmente discutendo:

confusing.c: 2: avviso: tipo di ritorno di 'main' non è `int 'confusing.c: In funzione `main ':confusing.c: 6: warning: operazione su `a 'può essere non definitoconfusing.c: 6: warning: operazione su `a 'può essere non definitoconfusing.c: 7: ATTENZIONE: la dichiarazione implicita di funzione `printf '
 
echo47 ha scritto:

Non vi è alcun problema di questo tipo nello standard C.
Lo dice una espressione non è consentito modificare una variabile più di una volta tra i punti di sequenza.
violates that rule, so the results are undefined (anything could happen).
L'istruzione b = (a - - A a);
viola tale regola, per cui i risultati sono indefiniti (tutto può accadere).
Per utilizzare tale codice nel vostro programma è un bug, anche se ti dà i risultati attesi.Tutti i programmatori C dovrebbe leggere il comp.lang.c FAQ.
È dotato di ottimi consigli, compreso il tema che stiamo discutendo.
<img src="http://www.edaboard.com/images/smiles/icon_wink.gif" alt="Ammiccare" border="0" />
[H url] ** p: / / C-faq.com / [/ url]Ho anche consigliamo di utilizzare un compilatore più moderno di Turbo C. Quando posso compilare l'esempio con MinGW, i suoi messaggi di avviso identificare diversi bug, tra cui quello che stiamo attualmente discutendo:confusing.c: 2: avviso: tipo di ritorno di 'main' non è `int '
confusing.c: In funzione `main ':
confusing.c: 6: warning: operazione su `a 'può essere non definito
confusing.c: 6: warning: operazione su `a 'può essere non definito
confusing.c: 7: ATTENZIONE: la dichiarazione implicita di funzione `printf '

 
HI,

In questa dichiarazione b = (a - - A a);
'A' valore sarà incrementato una sola volta e decrementato una volta a causa di incremento prefisso e il valore sarà 10.A sarà di 10 non cambia il valore a causa di operatore di incremento postfix e dopo l'esecuzione della dichiarazione di cui sopra il valore di 'a' saranno 11.Ora, nel primo printf il valore sarà di 10 e nella dichiarazione printf accanto al valore della 'b' saranno 21.

 
aandavan, è ammissibile per un compilatore di comportarsi in quel modo, ma non si basano su di esso.

.

Lo standard C dice che i risultati sono indefiniti.
 
Ciao ech047,
Ho verificato con due compilatori TurboC e Epic turbo C. Ho ottenuto la stessa risposta.Ecco perché ho pensato tutti i compilatori produrrebbe lo stesso risultato.Ma in Keil la risposta è diversa.Così mi ha confermato che il valore può dipende dal compilatore

 
Vi suggerisco di seguire le regole MISRA durante la scrittura di codice.Questo è uno sforzo da parte dell'industria del motore a scrivere codice che dovrebbe funzionare con tutti i compilatori.

 
Che cosa è MISRA?Se si vuole scrivere bene di codice C portabile, seguire la ISO / IEC / ANSI C standard, non un altro insieme di regole, e non certo il comportamento del compilatore.

C.

Naturalmente, lo standard non è molto buona per imparare
C.

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

Aggiornamento:

ho scoperto che MISRA (Motor Industry Software Reliability Association) ha pubblicato "Linee guida per l'uso del linguaggio C in sistemi critici".Quel libro dice di usare C soltanto come definito nello standard ISO, e poi aggiunge ulteriori requisiti per aiutare il programmatore C evitare gli errori comuni.Che suona come una buona cosa!
Ultima modifica di echo47 il 28 Ottobre 2006 7:51, modificato 1 volta in totale

 
U di non utilizzare questo tipo di codici in C..La sua esecuzione non è definito in linguaggio C.I risultati possono varry da compilatore a compilatore.

 
Usa .. parentesi che renderanno più semplice e più chiara per u e per coloro che leggono il tuo codice .. e per il compilatore!

In questo modo di scrittura del codice .. diversi compilatori u darà risposte diverse!

 
La risposta è semplice

Primo incarico ...10 -11 11 dà 10

Ora A = 11 e B = 10
così, A B = 11 10 = 21

questo dipende ancora una volta sul compilatore e, naturalmente, po 'difficile il debug
Non utilizzare tale codifica in programma
parentesi Usa per la separazione

 
E 'una buona idea per fare analisi statica sul codice, utilizzando qualcosa come lanugine Gimpel.Gimpel anche fornire un controllo MISRA file pure.Sareste sorpresi quanti errori possono essere rilevati con l'analisi statica!
Nel settore automobilistico, il software deve essere compatibile MISRA.
MISRA è molto pignola sui tipi!

 

Welcome to EDABoard.com

Sponsor

Back
Top