Esigenze (in linea di principio) C ++ tra parentesi se condizione di affermazione?

5

Nel corrente C ++ quando il corpo delle istruzioni if contiene un solo comando, quindi:

Le parentesi attorno alla condizione if sono obbligatorie ma i blocchi sono facoltativi. Quindi, entrambi gli esempi sono OK:

if ( condition ) { return 0; }
if ( condition ) return 0;

Ma teoricamente è possibile farlo anche in senso opposto ?:

Blocchi obbligatori e parentesi attorno a if condizione facoltativa:

if ( condition ) { return 0; }
if condition { return 0; }

È teoreticamente possibile estendere la sintassi C ++ in questo modo? (ad esempio come estensione in qualche compilatore C ++ o teoricamente in qualche futuro standard C ++). O collide questa ipotetica estensione con qualche altra regola sintattica in C ++?

Nota: le opinioni personali se questa estensione deve essere apportata o meno sono irrilevanti - non è questa la domanda.

EDIT :

La severa interpretazione della domanda è stata ben risolta da Jules.

Ma se "parentesi opzionale" non significherà "opzionale in ogni caso" ma invece "facoltativo nella maggior parte dei casi", la modifica proposta in C ++ può ancora essere apportata. In rari casi d'angolo come quello nella risposta Jules, il compilatore può rilevare l'ambiquity e l'errore di output:

"Ambiguous if condition. You must explicitly use parenthesis to resolve it"
    
posta user3123061 07.01.2015 - 08:35
fonte

2 risposte

13

Non credo che alcuna estensione di questo tipo possa essere fatta. Il problema è che non sembra esserci alcun modo per dire se una parentesi è l'inizio di un inizializzatore o meno. Ad esempio, il seguente codice sembrerebbe essere ambiguo sotto la tua modifica proposta:

if new T{} { hello(); }

Le due interpretazioni sono:

  1. Crea una nuova T con un elenco di inizializzazione vuoto e se il risultato non è nullo, chiama "ciao".

  2. Crea una nuova T con il costruttore predefinito, e se il risultato non è nullo, non fare nulla. Quindi chiama "ciao" in entrambi i casi.

risposta data 07.01.2015 - 09:47
fonte
0

No. Gli standard C e C ++ specificano esplicitamente che la parola chiave if deve essere seguita da un'espressione parentesi. Il compilatore è richiesto per rifiutare qualsiasi programma in cui non sia il caso.

La sezione pertinente nello standard C ++ è §6.4 Istruzioni di selezione :

Selection statements choose one of several flows of control.

selection-statement:

if ( condition ) statement
if ( condition ) statement else statement

Questa è la grammatica BNR per l'istruzione if e vengono specificati ( e ) e quindi è necessario che l'istruzione corrisponda come valida.

Per rendere valida la tua sintassi suggerita sarà necessaria una revisione dello standard, che sei libero di proporre all'ISO Gruppo di lavoro 21 , ma dovrai difendere la proposta.

    
risposta data 07.01.2015 - 08:43
fonte

Leggi altre domande sui tag