【问题标题】:Arduino code — what's the use of while(0)?Arduino 代码——while(0) 有什么用?
【发布时间】:2017-10-07 19:36:15
【问题描述】:
const int buttonPin = 2;    
int buttonState = 0;        

void setup() {
  Serial.begin(9600);
  pinMode(buttonPin, INPUT);
}

void loop() {
  buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) {
    Serial.println("1");
    buttonState=LOW;
    delay(20000);
      while(0);
  }
}

基本上代码是这样工作的:

  • 按钮针的编号
  • 用于读取按钮状态的变量
  • 将按钮引脚初始化为输入:
  • 读取按钮值的状态:
  • 检查按钮是否被按下。如果是,则 buttonState 为 HIGH: 通过蓝牙发送 char 1:

我有一个 Arduino、HC 06 蓝牙模块、一个按钮和一个在按下按钮时拨打电话的应用程序(HC 06 向应用程序发送一个字节 1)

我的问题是,while (0); 是干什么用的?

----原始代码---- 常量 int PirSensor = 2; int 运动状态 = 0;

void setup() {
  Serial.begin(9600);
  pinMode(PirSensor, INPUT);
}

void loop() {
  motionState = digitalRead(PirSensor);
  if (motionState == HIGH) {
    Serial.println("1"); 
    motionState = LOW;
    delay(20000);
//    while(0);
  }

}

【问题讨论】:

  • 它什么也没做,就像那样。你为什么把它放在那里?
  • 因为我从另一个添加了我的代码,而不是按钮,它有一个 PIR 运动检测器。我无法理解这段时间的含义。
  • @PedroFerreita 你能展示一下原来的例子吗?
  • 您看到while (0); 的最常见上下文是在do { … } while (0); 循环的末尾。我认为公平地说这是while (0); 有用的唯一上下文。就目前而言,循环的空体永远不会执行,因为循环继续条件无条件为假(零)。一种常见的替代方法是无限循环——while (1) { … },有时会有一个空循环体。这次条件无条件为真(非零)。
  • 我见过 do{} while(0) 在预处理器宏中用于防范某些事情,但我不记得它是什么了。我认为这是为了确保放在后面的多语句宏没有大括号,就像它们是单行一样。

标签: c arduino


【解决方案1】:

好吧,如果我在这种情况下没有弄错的话。

在大多数计算机编程语言中,while 循环是一种控制流语句,它允许根据给定的布尔条件重复执行代码。 while 循环可以被认为是一个重复的 if 语句。

请注意,如果您确实有条件,则 while 循环必须有退出选项,如下所示:

const int buttonPin = 2;    
int buttonState = 0;        

void setup() {
  Serial.begin(9600);
  pinMode(buttonPin, INPUT);
}

void loop() {
  buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) {
    Serial.println("1");
    buttonState=LOW;
    delay(20000);
    int a =0;
      while(a==0){
        if (something)
          a=1;
      }
  }
}

然后在您选择的条件下,您将退出循环。

【讨论】:

    【解决方案2】:

    while(0) 最常用于宏定义中,特别是那些打算像void 函数或其他指令一样使用的宏定义,例如

    #define inc(x) do { x = ((x)+1); } while (0)
    

    使用它的原因仅仅是通过强制用户将; 附加到宏调用来使宏的使用看起来像函数调用。在上面的例子中,

    inc(a)
    a = a*2;
    

    由于while(0)宏展开后缺少;会导致编译错误,所以你必须写

    inc(a);
    a = a*2;
    

    这使得代码看起来更像inc 是一个函数。此外,将宏的代码嵌入到这样的循环中有助于防止意外将宏用作表达式,类似于void 函数。 (a = ((a)+1) 是一个有效的表达式,所以如果宏不包含(语义上不相关的)while 循环,b = inc(a) 也将是有效的(扩展为 b = a = ((a)+1))。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-30
      • 2012-03-08
      • 2010-09-20
      • 2017-03-23
      • 2021-04-14
      • 1970-01-01
      相关资源
      最近更新 更多