首次使用布尔 C++ 或 Java

using a first time boolean c++ or java

本文关键字:C++ Java 布尔      更新时间:2023-10-16

>我通常使用布尔值'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 子句中使用布尔/布尔值并自动将值 false 分配给该布尔/布尔值?

我知道这似乎是胡说八道,但它会节省我的代码很多行,因为我有很多基本情况,并且在大范围内或时间中这是至关重要的。

我确实想知道在 if 子句中使用值后是否无论如何都要将值放入 false。我知道在 for 或 while 中,我们可以只使用:

if (i == 0)

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

我只是将条件更改为

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

并完全摆脱额外的变量。

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

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

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

有一个特定于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 中复制此解决方案。

for (int i = 0, firstTime = 1; i < v.size(); i++, firstTime = 0) {

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

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

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

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

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

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

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

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

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

为什么不做这样的事情:

void firstTime() {
    // do stuff
}
void doWork(int i) {
    // do stuff
}
firstTime();
for(int i = 1; i<v.size();i++) {
 doWork(i);
}

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

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

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

if ( i == 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);
你可以

试试(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