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.
In C, all variables must be declared before they are used, usually at the beginning of the function before any executable statements.
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.
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.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With