2

I'm programming C++ for arduino and today I have seen an example like this

void loop() {
    byte variable = 0; // << This variable is the question.
    //more stuff here
}

Is the same as this?:

byte variable = 0;

void loop() {
    //stuff here
}

If the answer is "no", my question is "why?".

Thanks for your time!

1
  • To make them act the same while restricting scope of variable to loop(), use eg void loop() { static byte variable = 0; ...} Commented Jan 28, 2016 at 18:07

2 Answers 2

5

The difference is not only about where you set the variable, but about where you defined it as well.

Defined outside the function, it will have global scope and lifetime, meaning it is visible everywhere and it exists for the entire duration of the program. If you then place an initializer inside the function, whatever value it had just before function-entry will be replaced by the initializer value.

If you define it inside the function (and without a "static" specifier) it only exists while that function is executing, and is only visible to code inside the function. Because it only comes into existence when the function is entered, you must initialize it within the function, somehow.

If you define it inside the function, but with a static specifier,

static byte variable = 0; 

then it will exist for the entire execution of the program but will only be visible to code within the function. In addition, an initializer on its definition (as opposed to other assignments to the variable) will only be executed once, just before the program begins executing, and will not be executed within function.

Using local and static (as opposed to global) variables is considered good program-variable hygiene because it hides those variables (to a greater or lesser degree) from code that needn't and shouldn't be able see or alter them.

4

No, it's not the same. Instructions within the loop() repeat every time the program gets to the end. If you set your variable at the start of the loop, it will automatically get reset to the default when you might not want it to be reset. The author of the example wants to reset to default every time the loop completes.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.