Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Where can I legally declare a variable in C99?

When I was first introduced to C I was told to always declare my variables at the top of the function. Now that I have a strong grasp of the language I am focusing my efforts on coding style, particularly limiting the scope of my variables. I have read about the benefits to limiting the scope and I came across an interesting example. Apparently, C99 allows you to do this...

for (int i = 0; i < 10; i++) {    puts("hello"); } 

I had thought that a variables scope was limited by the inner-most surrounding curly braces { }, but in the above example int i appears to be limited in scope by the curly braces of the for-loop even though it is declared outside of them.

I tried to extend the above example with fgets() to do what I thought was something similar but both of these gave me a syntax error.

fgets(char fpath[80], 80, stdin); *See Note**

fgets(char* fpath = malloc(80), 80, stdin);

So, just where exactly is it legal to declare variables in C99? Was the for-loop example an exception to the rule? Does this apply to while and do while loops as well?

*Note**: I'm not even sure this would be syntactically correct even if I could declare the char array there since fgets() is looking for pointer to char not pointer to array 80 of char. This is why I tried the malloc() version.

like image 434
SiegeX Avatar asked Feb 23 '10 20:02

SiegeX


People also ask

Where we can declare variable?

In C, all variables must be declared before they are used, usually at the beginning of the function before any executable statements.

Where can you declare variables in C?

The convention in C is has generally been to declare all such local variables at the top of a function; this is different from the convention in C++ or Java, which encourage variables to be declared when they are first used.

How do you declare a variable value?

The first time a variable is assigned a value, it is said to be initialised. The = symbol is known as the assignment operator. It is also possible to declare a variable and assign it a value in the same line, so instead of int i and then i = 9 you can write int i = 9 all in one go.

How do you declare a variable type?

You can use declarative statements to explicitly declare the variables you will use in your program. You can implicitly declare a variable's type simply by using the variable in an assignment statement.


1 Answers

In C99, you can declare your variables where you need them, just like C++ allows you to do that.

void somefunc(char *arg) {     char *ptr = "xyz";     if (strcmp(arg, ptr) == 0)     {         int abc = 0;    /* Always could declare variables at a block start */          somefunc(arg, &ptr, &abc);          int def = another_func(abc, arg);   /* New in C99 */         ...other code using def, presumably...     } } 
  • You can declare a variable in the control part of a 'for' loop:

      for (int x = 0; x < 10; x++)    /* New in C99 */ 
  • You cannot declare a variable in the control part of a 'while' loop or an 'if' statement.

  • You cannot declare a variable in a function call.

  • Obviously, you can (and always could) declare variables in the block after any loop or an 'if' statement.

The C99 standard says:

6.8.5.3 The for statement

The statement

for ( clause-1 ; expression-2 ; expression-3 ) statement 

behaves as follows: The expression expression-2 is the controlling expression that is evaluated before each execution of the loop body. The expression expression-3 is evaluated as a void expression after each execution of the loop body. If clause-1 is a declaration, the scope of any variables it declares is the remainder of the declaration and the entire loop, including the other two expressions; it is reached in the order of execution before the first evaluation of the controlling expression. If clause-1 is an expression, it is evaluated as a void expression before the first evaluation of the controlling expression.

like image 152
Jonathan Leffler Avatar answered Oct 05 '22 22:10

Jonathan Leffler