当我在测试中使用std :: istream对象(在下面的例子中来自cplusplus.com,std :: ifstream)时:" if(myistreamobject)",对象,这是自动分配在堆栈中永远不会为空,对吧?...在下面的例子中,我们使用相同的测试来检查是否所有字节都是从文件中读取的......这真的是一个奇怪的代码,当我处理指针时,我通常使用那种风格......
我想知道在std :: istream中使用哪种机制来在测试中返回一个值,这个值的真正意义是什么......(上一次操作的成功/失败??)是一个重载bool cast(就像在MFC类CString中强制转换的const char *操作符)或者它是另一种技术吗?
因为对象永远不会为null,所以将它放在测试中将始终返回true。
function onOpen()
{
var ss = SpreadsheetApp.getActiveSheet();
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Required Items List');
var ss = SpreadsheetApp.getActive();
var range = sheet.getRange('Required Items List!E8:G22');
var data = range.getValue();
var today = new Date();
Logger.log(data);
Logger.log(today);
if (data == today)
{
Browser.msgBox('Send Required Items Reminders Today!', Browser.Buttons.OK);
}
else {}
}
答案 0 :(得分:3)
if (expression)
测试它expression
求值为true
这是一个布尔值。它适用于指针,因为nullptr
/ NULL
/ 0
评估为false
,其他所有内容true
。出于同样的原因,它适用于整数值。
对于某个对象,它属于operator bool()
,请参阅http://en.cppreference.com/w/cpp/io/basic_ios/operator_bool。
检查流是否没有错误。
1)如果fail()返回true,则返回空指针,否则返回非空指针。该指针可以隐式转换为bool,可以在布尔上下文中使用。
2)如果流没有错误并且已准备好进行I / O操作,则返回true。具体来说,返回!fail()。
此运算符可以使用流和函数返回对流的引用作为循环条件,从而产生惯用的C ++输入循环,例如while(stream>> value){...}或while(getline( stream,string)){...}。
仅当输入操作成功时,此类循环才会执行循环体。
答案 1 :(得分:2)
operator bool()
如果流没有错误,返回,否则返回false。
“ no error ”概念与之前在流本身上完成的操作有关。
例如:在调用构造函数
之后std::ifstream is ("test.txt", std::ifstream::binary);
设置流对象中的内部状态标志。因此,当您调用运算符 bool 时,检查构造操作是否失败。
此外,方法
is.read(...)
还设置此内部状态标记,如reference:
中所示通过修改内部状态标志来发出错误信号: eofbit , failbit , badbit 。
因此,在方法调用之后,如果流到达EOF(文件结束),则设置状态位,并且操作符bool将返回正值。
这意味着在那种情况下使用
测试流if (is) { ... }
并且状态位置位,然后将验证条件并且将采用if分支。
答案 2 :(得分:1)
std::istream
已将运营商声明为:
explicit operator bool() const;
当你写作
if(SomeStdIstremObject) { ... }
确实在调用if(SomeStdIstreamObject.operator bool())
而不是检查非零