这可能是最糟糕的方式,但我希望Arduino在1和-1之间进行选择。这段代码不起作用,有什么问题。
这是我对代码的理解:
>
int定义为0。
while循环开始是因为条件为真。
选择一个随机变量。
如果int为1或-1,则while循环结束并打印值。
如果int为0,则while循环重新开始。
int random_number = 0;
void setup() {
Serial.begin(9600);
while (random_number == 0){
int random_number = random(-1,2);
Serial.println(random_number);
delay(1000);
}
Serial.print("value ");
Serial.println(random_number);
}
void loop() {
}
问题是您再次在while循环中声明了random_number
。这是循环的局部范围中的一个新的、不同的变量,而不是代码开头声明的全局变量。此外,它还在每个循环中再次声明。
int random_number = 0;
void setup() {
Serial.begin(9600);
while (random_number == 0){
random_number = random(-1,2); // not declared again
Serial.println(random_number);
delay(1000);
}
Serial.print("value ");
Serial.println(random_number);
}
void loop() {
}
请注意,intrandom_number
在循环内被random_number
替换。现在正在使用全局声明的变量random_number
,而不是声明一个同名的新局部变量。
为了使eventHandler的(正确)响应稍微清晰一些,因为对于阅读它的人来说似乎仍然有困惑:
问题出在线路上
int random_number = random(-1,2);
因为通过包含类型说明符(int
声明器),在while
循环的范围内声明了一个名为random_number
的新变量。如前所述,该变量与行中全局声明的变量不同
int random_number = 0;
因此,它不是在while
循环条件中使用的。
通常,编译器将多个声明标记为问题,但由于问题中的变量具有不同的范围,因此实际执行的操作称为阴影。在这里,循环的random_number
隐藏(或阴影)在全局范围内声明的循环,因此它被分配了一个随机数而不是预期的变量。当解析具有不同作用域的变量时,“最局部”的变量优先于“最小局部”的变量。
因此,while
循环中random_number
的定义应为:
random_number = random(-1,2);
在这种情况下,全局变量被分配了一个新值(而不是分配了一个新变量),代码片段中只存在该名称的一个变量,问题就解决了。