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 effor
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.
The bottom line with respect to your for/fgets confusion is that while "enclosing braces control scope" is the correct rule in C most of the time, there is another rule regarding scope in C99 (borrowed from C++) that says that a variable declared in the prologue of a control structure (i.e. for, while, if) is in scope in the body of the structure (and is not in scope outside the body).
The first thing I'd note is that you shouldn't confuse
for (int i = 0; i < 10; i++) {
puts("hello");
}
and
fgets(char* fpath = malloc(80), 80, stdin);
The first is a control structure while the second is a function call. The control structure evaluates the text inside it's parens() in a very different way from how a function call does.
The second thing is... I don't understand what you're trying to say by:
the compiler will promptly give you an error if you try to use i inside the for-loop body.
The code you listed for the for loop is a very common structure in C and the variable "i" should, indeed, be available inside the for loop body. Ie, the following should work:
int n = 0;
for (int i = 0; i < 10; i++) {
n += i;
}
Am I misreading what you're saying?