[解決済み】警告 - 符号付き整数式と符号なし整数式の比較
質問
現在、私は アクセラレイテッド C++ で、演習2-3で問題に遭遇しました。
プログラムの簡単な概要 - このプログラムは基本的に名前を受け取り、アスタリスクの枠の中に挨拶文を表示するものです。
エクササイズ
- サンプルプログラムでは、著者は
const int
で、挨拶文とアスタリスクの間のパディング(空白)を決めている。そして、読者に演習の一環として、パディングの大きさをどの程度にするか、ユーザーに意見を求めるよう求めている。
簡単そうなので、ユーザーに2つの整数(
int
を保存し、作者が使っていたものを削除して、これらの整数を使うようにプログラムを変更しました。しかし、コンパイル時に次のような警告が出ました。
Exercise2-3.cpp:46: 警告: 符号付き整数式と符号なし整数式の比較
調べてみると、このコードは上記の整数の1つを比較しようとするためであるようです (
int
) を
string::size_type
でいいんです。しかし、気になったのは、これは整数の1つを
unsigned int
? 整数が符号付きか符号なしかを明示することは重要ですか?
cout << "Please enter the size of the frame between top and bottom you would like ";
int padtopbottom;
cin >> padtopbottom;
cout << "Please enter size of the frame from each side you would like: ";
unsigned int padsides;
cin >> padsides;
string::size_type c = 0; // definition of c in the program
if (r == padtopbottom + 1 && c == padsides + 1) { // where the error occurs
上記は、関連するコードのビットである
c
は
string::size_type
というのも、挨拶文の長さがわからないからです。
const int
? また
アクセラレイテッド C++
- は、この本の後半で説明されるのでしょうか?
私はLinux MintでGeany経由でg++を使用しています。
string::size_type
があります)。
解決方法は?
通常、変数を
unsigned
または
size_t
と比較される場合、この問題を回避することができます。 可能な限り、比較する型と同じものを使用します。
std::string::size_type
と比較する場合
std::string
の長さ)。
符号付きint型と符号なしint型は範囲が異なるため、比較すると意外な結果になることがあるため、コンパイラは符号付きと符号なしの比較について警告を出します。 このような比較をする必要がある場合は、明示的に値の一方を他方と互換性のある型に変換し、変換が有効であることを確認した上で行う必要があります。 例えば
unsigned u = GetSomeUnsignedValue();
int i = GetSomeSignedValue();
if (i >= 0)
{
// i is nonnegative, so it is safe to cast to unsigned value
if ((unsigned)i >= u)
iIsGreaterThanOrEqualToU();
else
iIsLessThanU();
}
else
{
iIsNegative();
}
関連
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み] 私的相続、公的相続、保護相続の違いについて
-
[解決済み] C++11の'typedef'と'using'の違いは何ですか?
-
[解決済み] g++とgccの違いは何ですか?
-
[解決済み] C++の'struct'と'typedef struct'の違い?
-
[解決済み] std::vector に対する反復処理: 符号なしインデックス変数と符号ありインデックス変数の比較
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件