C 如何仅当变量更改为特定值时才使if条件为真 我们考虑下面的程序: while(1) { if(foo1 == HIGH) { printf("foo1 is high"); } if(foo2 == HIGH) { printf("foo2 is high"); } }

C 如何仅当变量更改为特定值时才使if条件为真 我们考虑下面的程序: while(1) { if(foo1 == HIGH) { printf("foo1 is high"); } if(foo2 == HIGH) { printf("foo2 is high"); } },c,if-statement,C,If Statement,由于这些条件在中,而(1)循环当foo1处于高位时printf将继续打印,直到foo1处于低位,而foo2也是如此 是否有任何可能的方法,我只能在条件变为真实且不连续时打印?此外,当foo1变为低位并再次变为高位时,if条件应再次为真 编辑 使用标志检查条件在此处不起作用,因为 bool check = false; while(1) if(foo1 == HIGH && check == false) { printf("foo1 is high"); ch

由于这些条件在
中,而(1)
循环当
foo1
处于高位时
printf
将继续打印,直到
foo1
处于低位,而
foo2
也是如此

是否有任何可能的方法,我只能在条件变为真实且不连续时打印?此外,当
foo1
变为低位并再次变为高位时,if条件应再次为真

编辑

使用标志检查条件在此处不起作用,因为

bool check = false;
while(1)
if(foo1 == HIGH && check == false)
  {
    printf("foo1 is high");
    check = true;
  }

这只会使它运行一次。但假设一段时间后,如果
foo1
再次变高,则不会执行if条件,因为检查仍然为真,因为
bool check
是在
之外定义的,而(1)
。如果我们在
中定义它,而(1)
,那么如果条件将继续,因为每次检查都将设置为false。

您可以使用
中断退出循环

您可以设置一个check变量

 bool check1 = false;
 bool check2 = false;
然后检查循环是否已打印

例如

如果是闭锁行为,那么可能

 if( foo1 == HIGH && check1 == false )
 {
     check1 = true;
     printf( "foo1 is high");
 }
 else if( foo1 != HIGH )
 {
     check1 = false;
 }

您需要一种方法来记住您已经显示了消息。您可以使用布尔变量来实现这一点。比如:

bool foo1MsgDisplayed = false;
bool foo2MsgDisplayed = false;

while(1) {
  if(foo1 == HIGH && !foo1MsgDisplayed) {
    printf("foo1 is high");
    foo1MsgDisplayed = true;
  }
  if(foo2 == HIGH && !foo2MsgDisplayed) {
    printf("foo2 is high");
    foo2MsgDisplayed = true;
  }
}
编辑根据您的评论,当
foo
更改为“低”时,您似乎希望重置标志:

bool foo1MsgDisplayed = false;
bool foo2MsgDisplayed = false;

while(1) {
  if(foo1 == HIGH) {
    if(!foo1MsgDisplayed) {
      printf("foo1 is high");
      foo1MsgDisplayed = true;
    }
  }
  else {
    foo1MsgDisplayed = false;
  }

  if(foo2 == HIGH) {
    if(!foo2MsgDisplayed) {
      printf("foo2 is high");
      foo2MsgDisplayed = true;
    }
  else {
    foo2MsgDisplayed = false;
  }
}

循环用于多次重复运行任何内容。如果你想让它只运行一次,你根本不需要那个循环。你可以在外面给那些特定的代码行。
如果出于某些原因希望它在内部,可以使用bool变量查看它是否已经执行,并中断If语句。

假设您确实需要这个无限循环

while(1)
{
  if(foo1 == HIGH)
  {
    printf("foo1 is high");
  }
  if(foo2 == HIGH)
  {
    printf("foo2 is high");
  }
}
您只需将
foo1
foo2
重置为其
if
语句中不同于高值的值即可

while(1)
{
  if(foo1 == HIGH)
  {
    printf("foo1 is high");
    foo1 = LOW;
  }
  if(foo2 == HIGH)
  {
    printf("foo2 is high");
    foo2 = LOW;
  }
}
如果这不是完整代码,并且
while
循环包含更多可以修改
foo1
foo2
的代码,则指示条件是否为真的标志可以帮助:

bool foo1_flag = false;
bool foo2_flag = false;

while(1)
{
  if(!foo1_flag && foo1 == HIGH)
  {
    printf("foo1 is high");
    foo1_flag = true;
  }
  if(!foo2_flag && foo2 == HIGH)
  {
    printf("foo2 is high");
    foo2_flag = true;
  }
}
编辑

如果需要
printf
在foo变低后再变高时工作,则需要重置标志(这不是您最初要求的)


大概你正在循环中做其他事情。在这种情况下,最干净的方法是将要执行的代码移到循环之前执行一次:

if(foo1 == HIGH)
{
  printf("foo1 is high");
}
if(foo2 == HIGH)
{
  printf("foo2 is high");
}
while(1)
{
  // do whatever needs to be done repeatedly
}

把时间分成两段

while(foo1 == HIGH)
{  
    printf("foo1 is high");
}

while(foo2 == HIGH)
{
    printf("foo2 is high");
}

将两个while放在主管道内

while(1)
{
    while(foo1 == HIGH)
    {  
        printf("foo1 is high");
    }

    while(foo2 == HIGH)
    {
        printf("foo2 is high");
    }
}

您可以执行以下操作并记住foo的旧值,并且仅当自上次执行以来它发生了更改时才打印

Type oldFoo1 = null / -1;
Type oldFoo2 = null / -1;

while(1) {
  if(oldFoo1 != foo1 && foo1 == HIGH)
  {
    printf("foo1 is high");
  }
  if(oldFoo2 != foo2 && foo2 == HIGH)
  {
    printf("foo2 is high");
  }
  oldFoo1 = foo1;
  oldFoo2 = foo2;
}

许多已经发布的答案都假设您可以更改变量,或者只想显示一次消息。我的理解是,每次foo1变高时,您都希望显示消息。因此,一般问题是检测更改,而不记得是否显示了消息

你只需要记住之前的值就可以了

int prevfoo1 = LOW;

while(1)
{
  if (prevfoo1 != foo1)
  {
    if (foo1 == HIGH)
      printf("foo1 is high");
    prevfoo1 = foo1;
  }
}


这样,每次foo1变高时,您都会收到通知。您也可以将其用于常规更改检测,因为我们不存储布尔值,而是存储实际的上一个值。

在printf之后,只需将foo1设置为low?我是不是遗漏了什么?如果无法更改foo1,只需打印另一个变量foo1printed,在printf之后设置为true。@Amit无法删除,而程序需要连续检查foo@HugoRune没有明白你的意思,如果你说的是使用旗帜,那么它在这里就不起作用了。!或者如果你能给我demo@user9999查看我的答案,它将在每次foo1变高时打印消息,而不是只打印一次,并且不会更改变量。@user9999希望我的编辑使您的问题更清楚,如果没有,请回滚和/或编辑它。我在哪里可以定义bool check1=false?问题是如果check1变为true,那么当foo1在几秒钟后再次变高时,printf将不会再次执行。!也许可以编辑你的问题。当可以再次打印时,将执行保护检查1。如果需要,可以将其设置为false。是的,您是对的。但假设我定义bool check1=false;外部while(1),所以如果foo1再次变高,那么它将不会执行if条件,因为check1设置为true。如果我们定义bool check1=false;在里面,而(1)然后它将继续显示printf作为条件将匹配每次我在评论中说的mksteve答案。当if条件第一次运行时,foo1_标志变为true,因此printf只显示一次。但几秒钟后,如果foo1再次变高,则当foo1_flag1设置为true时,if条件将不会运行,因为bool foo1_flag=false;是在while(1)之外定义的,因此它不会work@user9999但是您要求使
printf
运行一次。那么它会不会起作用呢?它会第一次起作用,但是如果foo1再次升高,那么它就不会起作用了。!我每次都需要检查foo1的状态,所以在(1)的时候把它放在外面是行不通的。!不是根据我回答的问题。这些变量如何变化?没有修改它们的代码。如果我说你问错了问题,会不会显得很无礼?在提问之前,请尽量明确你的要求。也许我没有正确地描述我的问题。!没关系,不是很好。我们只是浪费时间,因为你想得不够仔细。我们都在浪费时间,而不是花时间问正确的问题。我给你的建议是在你开口之前多想想。尝试提出更好的问题。这不会一次显示消息,这将永远显示消息,如果是单线程程序,变量甚至永远不会改变状态。我在写这篇文章时没有看到OP的编辑,因为它还没有出现;-]但是你不认为while还会一次又一次地显示printf吗
Type oldFoo1 = null / -1;
Type oldFoo2 = null / -1;

while(1) {
  if(oldFoo1 != foo1 && foo1 == HIGH)
  {
    printf("foo1 is high");
  }
  if(oldFoo2 != foo2 && foo2 == HIGH)
  {
    printf("foo2 is high");
  }
  oldFoo1 = foo1;
  oldFoo2 = foo2;
}
int prevfoo1 = LOW;

while(1)
{
  if (prevfoo1 != foo1)
  {
    if (foo1 == HIGH)
      printf("foo1 is high");
    prevfoo1 = foo1;
  }
}