POSIXシステム上のファイルパスを表す文字列に '..'が存在するかどうかを検索しようとしています。私はstd :: string.find( "..")を使用していますが、正しいインデックスを見つけているようですが、ブール式で正しく評価されていません。例えばC++ std :: string.findは未処理の結果をブール式で返します
:
#include <string>
#include <stdio.h>
int main(int argc, char *argv[]) {
std::string a = "abcd";
int apos = a.find("..");
bool test1 = a.find("..") >= 0;
bool test2 = apos >= 0;
if (test1) {
printf("TEST1 FAILED: %ld >= 0!\n", a.find(".."));
}
if (test2) {
printf("TEST2 FAILED %d >= 0!\n", apos);
}
}
出力:
$ g++ test.cpp -o test
$ ./test
TEST1 FAILED: -1 >= 0!
$
なぜa.find("..")
ブール式に-1に評価されていない任意のアイデア?
より多くのコンパイラの警告を有効にします。具体的には、 'error:unsigned expression> = 0の比較は常に真です[-Werror = type-limits]'に興味があります。 – Biffen
'std :: find'の戻り値の型は符号なし整数であるため、負ではありません。 See [string.find()は、== - 1が使用されている場合はtrueを返しますが、<0が使用されている場合はfalseを返します(http://stackoverflow.com/a/40392882/3309790) – songyuanyao