首次使用布尔 C++ 或 Java
using a first time boolean c++ or java
>我通常使用布尔值'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
- 在java中解决这段代码时面临循环中的问题
- 尝试用java代码编译和运行c++代码
- 在这种情况下,java对象是否可以调用本机函数
- 在java中读取c++字节的位字段
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- 使用已使用 java 编码的 openssl 解码数据
- SWIG Java 在使用 -DSWIGWORDSIZE64 时将int64_t转换为 jlong
- Android Java USB for native cpp
- 在由Sublime文本3编译后在cmd上显示Java程序输出
- C++ equivalent to Java Map getOrDefault?
- C++ 中的 Java 样式枚举
- 是否有技术原因阻止 Java 中的 final C++ 像 const 一样严格?
- 加密在 Windows、C++ 和 Java 中传输中的数据
- Java从C++回调到C++回调
- 在 c++ 中模拟输入并在 JAVA 中读取它?
- 用C++包装 Java 库 (JNI)
- 使用 TreeSet Java 对反转进行计数
- 验证openssl c++中的签名,这是由JAVA DSA签名的?
- 如何通过 JNI 将 C 字符串表情符号传递给 Java
- 如何从保存在 Java 中C++的字节数组中读取数字?