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;
}
}