Newsgroup: it.comp.lang.c++
Titolo: [Q]: errore mio o del compilatore?

Ciao a tutti,
ho questo semplice problema (nel senso che č semplice girarci
attorno), che perň mi ha incuriosito un pň! Semplicemente:
if (UINT uErr = waveOutSetVolume(0, volume_))
   ...
compila, mentre
if ((UINT uErr = waveOutSetVolume(0, volume_) ))
   ....
non compila. L'unica differenza č un paio di parentesi in piů attorno
all'espressione contenuta nella clausola dell'if. Il compilatore che
uso č l'eMbedded Visual C++ 3.0.

On 15 Jul 2002 00:30:52 -0700, 
sfin...@ro.record.unipd.it
 (Simone
Finotti) wrote:

nel primo caso viene valutato il risultato di uErr dopo che
waveOutSetVolume e' stato mandato in esecuzione, e se uErr != 0 allora
viene eseguito il codice dentro l'if..
nel secondo caso uErr viene assegnato, ma non c'e' un valore con cui
compararlo.. forse embedded vc++ 3 e' un po' + restrittivo.. che
errore ti da di preciso?
Antonio



Il compilatore ha ragione: quelle due parentesi in piů non sono
consentite. Considera la sintassi prevista per lo statement if, come
presentata nello Standard:
[stmt.select]
   if ( condition ) statement else statement
   condition: 
         expression
         type-specifier-seq declarator = assignment-expression
Quindi, se la 'condition' non č una 'expression', deve avere la forma
indicata, che non contempla ulteriori parentesi.
Max

Salve a tutti,
ho questo semplice quesito: perchè il codice che riporto qui sotto
funziona
if (MMERROR error = waveOutSetVolume(0, volume_))
   ...
mentre questo non funziona?
if ((MMERROR error = waveOutSetVolume(0, volume_)))
   ...
eppure ho solo aggiunto un paio di parentesi attorno all'espressione.
Mi sfugge qualcosa forse?
PS. ho già postato questo messaggio, ma da Google non lo vedo. Chiedo
scusa se a voi appare due volte.

 errore ti da di preciso?
Mi da quattro errori, che riporto qui:
error C2146: syntax error : missing ')' before identifier 'uErr2'
error C2065: 'uErr2' : undeclared identifier
error C2106: '=' : left operand must be l-value
error C2059: syntax error : ')'

 indicata, che non contempla ulteriori parentesi.
Ok, quindi anche questa non è una expression:
(MMRESULT uErr = waveOutGetVolume(0, &volume_)) != MMSYSERR_NOERROR
giusto?

 giusto?
esatto, infatti non compila neppure questa...
ciao Anto
-- 
Antonio Cuni, 20 anni, studente
Brainbench C++ Master: 4.73, higher than 99% of all previous test takers.
C Language: 3.79, higher than 92% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it

 esatto, infatti non compila neppure questa...
ottimo, ma allora cos'è?

 ottimo, ma allora cos'è?
secondo la grammatica non e` nulla:
selection-statement:
        if( condition ) statement
condition:
        expression
        type-specifier-seq declarator = assignment-expression
quindi all'interno delle parentesi dell'if puo` esserci solo una 
expression o una "dichiarazione+assegnazione"; dato che nel secondo caso 
le parentesi *non* ci sono significa che non possiamo utilizzarle; se 
andiamo a vedere cosa e` una expression non troviamo nulla che possa 
combaciare con la stringa in oggetto, per cui il parser non puo` far 
altro che dare errore...


 secondo la grammatica non e` nulla:
in effetti non l'avevo mai provato fino ad ora, ma quella riga non
compila neppure fuori da un if (anche aggiungendo il ';' alla fine).
Tutto il mio dubbio si basava sul fatto che ero convinto quella riga
dovesse compilare. Che abbaglio...
comunque grazie per le risposte :-)