Home > Blockchain >  Why does declaring variables on a single line give an unexpected result?
Why does declaring variables on a single line give an unexpected result?

Time:09-16

I programmed a simple clock and found that while hours and seconds are okay, minutes are not if I declare the variables on a single line (minutes starts at 16 and not at 0 as expected).

The problem is solved if I declare the variables on separated lines. I'm still curious though, anybody knows why?

Here's the code:

#include <stdio.h>
#include <windows.h>
//h=hours, m=minutes, s=seconds.
int main(){
    int h, m, s = 0; //THIS IS THE LINE: WHY "m" STARTS AT 16 AND NOT 0?
    int delay = 1000;
    while(1){
        s  ;
        if(s>59){
            m  ;
            s=0;
        }
        if(m>59){
            h  ;
            m=0;
        }
        if(h>12){
            h=1;
        }
        printf("\n d:d:d", h, m, s);
        Sleep(delay);
        system("cls");
    }
}

CodePudding user response:

Your variables are uninitialized - they can take any value, and using them before initialization is (usually) indeterminate behavior.

A line of code like:

int h, m, s = 0;

does not define each variable to be zero - only the third one. It is equivalent to:

int h;
int m;
int s = 0;

To fix, initialize all of your variables as zero:

int h = 0, m = 0, s = 0;

CodePudding user response:

You haven’t initialized h or m, so their initial values might whatever was in that memory already, or something else entirely. C does not automatically initialize variables to 0.

When you declare multiple variables on one line, the value only applies to the variable it comes after. So

int a, b, c = 5;

only sets c to 5, while

int a = 1, b = 2, c = 3;

initializes all of them. In your case, you just need to use

int h = 0, m = 0, s = 0;

You compiler likely has an option for warnings (-Wall in gcc), which should warn you about using an uninitialized variable.

CodePudding user response:

int h, m, s = 0; // THIS IS THE LINE: WHY "m" STARTS AT 16 AND NOT 0?

Well, I guess, because C is not English. The "= 0" part applies just to that one variable name s, not to the whole line.

Although, you know, English doesn't necessarily apply modifiers to the whole line, either. If I say "There were three people standing on the streetcorner: A man, a woman, and a boy named Brad", you would not infer that the man and the woman were named Brad, too, would you?

[Footnote: Now I've got that old song "Me and you and a dog named Boo" stuck in my head. :-) ]

  •  Tags:  
  • c
  • Related