3

我通常使用这样的布尔值“firstTime”:

在 C++ 中:

bool firsTime = true;
for (int i = 0; i < v.size(); i++) {
    if (firstTime) {
        //do something just once
        firstTime = false;
    }
    else {
        //do the usual thing
    }
}

在java中使用布尔值而不是布尔值是一样的,所以我不放代码。

问题是,在 java 或 c/c++ 中是否有在 if 子句中使用 bool/boolean 并自动为该 bool/boolean 分配值 false ?

我知道这似乎是无稽之谈,但它会节省我的代码很多行,因为我有很多基本案例,而且在大的情况下,这很关键。

我确实想知道在 if 子句中使用它之后是否有任何方法将值设置为 false 。我知道在一段时间内我们可以使用:

if (i == 0)

但我也在考虑调用需要了解事物并且通常由布尔值引用的函数。

4

11 回答 11

7

我只是将条件更改为

if ( i == 0 )
{ 
}
//...

并完全摆脱额外的变量。

编辑在一行中看到有关如何执行此操作的所有建议后,我只能得出一个结论-不要。只需使用你所拥有的,它就更清晰了。

于 2012-06-20T13:14:35.917 回答
4

如果您还没有计数,则可以使用一个而不是布尔值

long counter = 0;
for(String arg: args) {
    if(counter++ == 0) {
       // first
    }
}

使用布尔值的替代方法是

boolean first = true;
for(String arg: args) {
    if(first && !(first = false)) {
       // first
    }
}

对于集合有类似的模式

Set<String> seen = ...
for(String arg: args) {
    if(seen.add(arg)) {
       // first time for this value of arg as its only added once.
    }
}
于 2012-06-20T13:25:02.950 回答
4

有一个 C++ 特定的解决方案,它使用转换运算符来构建一次性防护:

class first_guard {
    bool val;
public:
    first_guard() : val(true) {}
    operator bool() { bool res = val; val = false; return res; }
};

以下是你如何使用警卫:

first_guard first;
for (int i = 0 ; i != 5 ; i++) {
    if(!first) {
        cout << i << ' ';
    }
}

此代码打印1 2 3 4,跳过0

缺少转换运算符会阻止您在 Java 中复制此解决方案。

于 2012-06-20T13:32:12.257 回答
2
for (int i = 0, firstTime = 1; i < v.size(); i++, firstTime = 0) {
于 2012-06-20T13:19:25.050 回答
1

如果第一次迭代除了通常的“东西”(而不是“而不是通常的东西”)之外应该有一些额外的初始化,我会考虑这样的事情:

for (int i=0, do_first_time_stuff(); i<v.size(); i++) {
    do_other_stuff();
}

另一种可能性是:

Initialization();
std::for_each(v.begin()+1, v.end(), loop_body);
于 2012-06-20T13:35:11.260 回答
1

编辑:请参阅 Luchian 的关于使用您所拥有的内容的编辑。我同意。非常清楚。

为什么不直接将第一个循环迭代拉出循环呢?

//do something just once (if needed, so check)
for (int i = 1; i < v.size(); i++) {
    //do the usual thing
}

现在,如果您有可能不做这第一件事,您需要检查一下,但很多时候您可能至少会做一次迭代。

于 2012-06-20T13:16:03.783 回答
0

我会在 for 循环之外第一次做任何你想做的事情,然后启动迭代器。

if (v.size() > 0) {
    /* first time code */
}
for (int i = 1; i < v.size(); i++) {
    /* second time or more */
}

如果您使用的是 foreach 循环,那么您的解决方案非常可靠。

于 2012-06-20T13:16:14.847 回答
0

为什么不做类似的事情:

void firstTime() {
    // do stuff
}

void doWork(int i) {
    // do stuff
}

firstTime();
for(int i = 1; i<v.size();i++) {
 doWork(i);
}
于 2012-06-20T13:16:57.823 回答
0

如果您在第一次活动中没有使用列表的内容。

if(v.size() >=1 ){
  //do Something for 1 time
}
for (int i = 0; i < v.size(); i++) {
        //do the usual thing
}

如果您需要列表的内容,请使用

if ( i == 0 )
{ 
}

正如 Luchian Grigore 所建议的那样

于 2012-06-20T13:20:20.837 回答
0

你可以试试(C++):

bool checkFirst(bool& first)
{
  bool result = first;
  first = false;
  return result;
}

bool firstTime=true;
// loop here { 
if (checkFirst(firstTime))
{
  // do firsttime stuff
} else {
 // do regular stuff
}
// } // end loop

爪哇:

public class CheckFirst
{
  private boolean first;

  public CheckFirst()
  {
    first = true;
  }

  boolean check()
  {
    boolean result = first;
    first = false;
    return result;
  }
}

CheckFirst first = new CheckFirst();
// loop here {
if (first.check()) {
  // do first stuff
} else {
  // do regular stuff
}
// } // end loop
于 2012-06-20T13:21:06.820 回答
0

我会尝试这样的事情,它有效,但我不确定这是否完全正确。(http://ideone.com/Bcjva

boolean boo = true;
if( !((boo) ? (boo = !boo) : boo)) //enters the if successfully, but inside,prints boo as false.
     System.out.println(boo);
于 2012-06-20T13:21:47.993 回答