Where can I legally declare a variable in C99?

前端 未结 3 1583
无人共我
无人共我 2020-12-18 17:50

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

相关标签:
3条回答
  • 2020-12-18 18:05

    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.

    0 讨论(0)
  • 2020-12-18 18:05

    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).

    0 讨论(0)
  • 2020-12-18 18:18

    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?

    0 讨论(0)
提交回复
热议问题