2012-11-28 8 views
5

私の質問はおそらくかなりばかげているようですが、私の学士試験に自分自身を準備している間に答える必要があります。C++で 'ab' == "ab"という表現は真ですか

だから、このような表現「ab」==「ab」はC++でどう思いますか?これは真実ではなく、単に合法ではなくエラーをコンパイルしているのでしょうか?私は..私はcompilatorは言語の形式的な記述が言うに過ぎないと言うものではないと考える必要はあり...

を少なからずをGoogleで検索し、「AB」はint型であることを知ってもらう、そしてもちろんの「AB」しています

+2

コンパイラは、標準に準拠している場合、その標準をよく示すものでなければなりません。 – chris

+0

http://stackoverflow.com/questions/7459939/what-do-single-quotes-do-in-c-when-used-on-multiple-charactersこれが役に立ったでしょう –

+0

「これはコンパイルしますか?」に対する義務的な応答質問:あなたはそれをコンパイルしようとしましたか? – Kevin

答えて

4

これは間違いなく警告を生成しますが、デフォルトではgccがコンパイルします。 通常はfalseにする必要があります。

言い換えれば、実行しているプラ​​ットフォームに応じて、計算上の定数が数値の数値と等しいメモリ位置にコンパイル時定数"ab"を持つことは理論上可能です(たとえ比較が無意味であっても)表現が真実である場合には、「ab」の意味を持つ。

1

警告が表示されますが、作成されます。それがすることは、マルチバイト整数 'ab'と文字列リテラル "ab"のアドレスを比較することです。

ボトムラインの場合、比較の結果は同じかどうかの文字の選択を反映しません。

0

標準型は、整数型とポインタの比較については何も言及していません。すべてのそれは(セクション5.9で)以下れる言葉:

The operands shall have arithmetic, enumeration, or pointer type, or type std::nullptr_t...

それはそれは二つのポインタを比較するために何を意味するのかについて詳細な説明に入り、2つの整数を比較することに言及しています。だから、仕様の欠如の私の解釈は、 "コンパイラライターが決定したもの"であり、エラーか警告かのどちらかです。

+1

実際には、標準の仕様が不足すると未定義の動作が発生します。コンパイラが何を決定したとしても、それは未指定の動作と混同される可能性があります。 Unspecの動作は整形式のプログラムを生成しますが、Undefの動作はしません。 –

0

シンプルなCの部分にはこれを考慮してください。 'c'は文字列を操作したい場合は単純なcharです。結果として 'ca'は期待通りに動作しません。 、そしてC++ではこのようなことはまだ有効です。 Stringを使用する場合は、生の型ではないStringクラスを使用する必要があります。そしてそれが何をするかは、メソッドと型defのクラスです。したがって、配列のcharsを簡単に処理できます。結果として、Cスタイルの文字列と文字の配列でさえも異なる結果になるので、結果 'ab' == "ab"は有効なブール値を返しません。 intと文字列を比較しようとするようなものです。だから、この共謀は、おそらくエラーを投げるでしょう。

4

CおよびC++の式'ab' == "ab"は無効です。それは意味がありません。どちらの言語でも、任意の整数値とポインタ値の比較はできません。このため、それが「真実」であるか否かは問題ではない。コンパイル可能な式に変換するには、オペランドを明示的に同等の型にキャストする必要があります。

ここでの唯一の抜け穴は、マルチchar文字定数の値が実装定義であることです。実装によっては、'ab'の値がゼロになる場合は、NULLポインタ定数として使用できます。その場合、'ab' == "ab"0 == "ab"NULL == "ab"に等しくなります。これは偽であることが保証されています。

関連する問題