Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C error: Expected expression before int

When I tried the following code I get the error mentioned.

if(a==1)   int b =10; 

But the following is syntactically correct

if(a==1) {    int b = 10; } 

Why is this?

like image 862
MsPillai Avatar asked Mar 15 '14 05:03

MsPillai


People also ask

What is expected expression before int in C?

Succinctly: the int b = 10 line is a declaration, not a statement, and the grammar for the if statement requires a statement after the conditional that it's testing. But if you enclose the declaration in braces, it becomes a statement and everything's well.

What is the expected expression error in C?

Expected expression. This error is produced whenever the compiler is expecting an expression on the line where the error occurred. In the following example, the trailing comma in the initializer indicates to the compiler that another expression will follow.

What is expected expression error in VBA?

The Expected: expression compile error means that while trying to compile the line, things went haywire because the compiler was expecting to find an expression but found nothing. This error happens if you leave one or more dangling commas at the end of a statement.


2 Answers

This is actually a fairly interesting question. It's not as simple as it looks at first. For reference, I'm going to be basing this off of the latest C11 language grammar defined in N1570

I guess the counter-intuitive part of the question is: if this is correct C:

if (a == 1) {   int b = 10; } 

then why is this not also correct C?

if (a == 1)   int b = 10; 

I mean, a one-line conditional if statement should be fine either with or without braces, right?

The answer lies in the grammar of the if statement, as defined by the C standard. The relevant parts of the grammar I've quoted below. Succinctly: the int b = 10 line is a declaration, not a statement, and the grammar for the if statement requires a statement after the conditional that it's testing. But if you enclose the declaration in braces, it becomes a statement and everything's well.

And just for the sake of answering the question completely -- this has nothing to do with scope. The b variable that exists inside that scope will be inaccessible from outside of it, but the program is still syntactically correct. Strictly speaking, the compiler shouldn't throw an error on it. Of course, you should be building with -Wall -Werror anyways ;-)

 (6.7) declaration:             declaration-specifiers init-declarator-listopt;             static_assert-declaration  (6.7) init-declarator-list:             init-declarator             init-declarator-list , init-declarator  (6.7) init-declarator:             declarator             declarator = initializer  (6.8) statement:             labeled-statement             compound-statement             expression-statement             selection-statement             iteration-statement             jump-statement  (6.8.2) compound-statement:             { block-item-listopt}  (6.8.4) selection-statement:             if ( expression ) statement             if ( expression ) statement else statement             switch ( expression ) statement 
like image 110
sheu Avatar answered Sep 21 '22 07:09

sheu


{ } -->

defines scope, so if(a==1) { int b = 10; } says, you are defining int b, for {}- this scope. For

if(a==1)   int b =10; 

there is no scope. And you will not be able to use b anywhere.

like image 29
Pranit Kothari Avatar answered Sep 21 '22 07:09

Pranit Kothari