1

構文ミスがあったかもしれませんが、コードが機能しない理由がわかりません。

私が書いた.mファイルの上に:

#define kCountry "Country";

この場合、xCodeから赤い警告が表示されました-予想されます]

次に、関数本体で:

 floatCountries = 74,2;
 [[NSUserDefaults standardUserDefaults]setFloat:floatCountries forKey:kCountry];

  float test= [[NSUserDefaults standardUserDefaults]floatForKey:kCountry];
  NSLog(@"%f", test);

その1つで-期待される表現。

それは少しばかげているように聞こえるかもしれませんが、コードを単純化してこれを使用したいので、助けてください!:)

4

3 に答える 3

9

定義の最後からセミコロンを削除し、「@」を追加します。

#define kCountry @"Country"
于 2013-03-02T16:40:43.643 に答える
5

使用する:

#define kCountry @"Country"

最後にセミコロンを追加しました。

そしてこれは文字列値に置き換えられるので、あなたは置く必要があります@

于 2013-03-02T16:41:22.507 に答える
5

これが機能しなかった理由を説明するには:

セミコロン

#define kCountry "Country";

この場合、xCodeから赤い警告が表示されました-予想されます]

「赤い警告」のようなものはありません。警告は黄色です。エラーは赤です。

(「警告をエラーとして扱う」をオンにしない限り、ある意味では、すべての警告は赤になります。これは、警告がエラーであるためです。)

ともかく。

などのプリプロセッサディレクティブ#defineはセミコロンを必要としません。含めると、ディレクティブの一部になります。

プリプロセッサは、マクロを定義したものに置き換えます。この場合、値「<code> "Country;"」で「<code>kCountry」という名前のマクロを定義しました。セミコロンは値の一部であることに注意してください。ディレクティブは、行の終わりではなく、行の終わりで終わります。セミコロン。

したがって、マクロを使用する場合は次のようになります。

[[NSUserDefaults standardUserDefaults]setFloat:floatCountries forKey:kCountry];

float test= [[NSUserDefaults standardUserDefaults]floatForKey:kCountry];

プリプロセッサは、次のようにマクロを置き換えます。

[[NSUserDefaults standardUserDefaults]setFloat:floatCountries forKey:"Country";];

float test= [[NSUserDefaults standardUserDefaults]floatForKey:"Country";];

セミコロンはステートメント内に入れることはできません。それは後に来なければなりません。したがって、上記のステートメントは無効です。

修正は#define、マクロをdした行からセミコロンを削除して、出力にセミコロンが表示されないようにすることです。

[[NSUserDefaults standardUserDefaults]setFloat:floatCountries forKey:"Country"];

float test= [[NSUserDefaults standardUserDefaults]floatForKey:"Country"];

ちなみに、Xcodeのジャンプバーには、コンパイラが表示するように、コードの完全な前処理バージョンを表示するオプションがあります。これは、マクロの問題を調査するときに便利です。

ですから、それが問題の1つです。もう1つは…</p>

使用した文字列の種類

"Country"C文字列です。これは、C文字列とstdioライブラリ(関数printf、などを含む)、およびC文字列を必要とするその他のさまざまなAPI(およびstrcatなど)でのみ使用できます。+[NSString stringWithUTF8String:]+[NSString stringWithCString:encoding:]

NSUserDefaultsは、文字列を必要とするCocoaの他のすべてと同様に、Cocoa文字列オブジェクト(NSString)を必要とします。NSStringリテラルの構文は同じですが、その@前にがあります@"Country"

したがって、動作するバージョン:

#define kCountry @"Country"

前処理された出力を生成します。

[[NSUserDefaults standardUserDefaults]setFloat:floatCountries forKey:@"Country"];

float test= [[NSUserDefaults standardUserDefaults]floatForKey:@"Country"];

構文エラーがなく、両方の場所に正しい種類の文字列があるため、これが機能するバージョンです。

ああ、そして、Anoop Vaidyaがすでに指摘したように:

数値構文

変数に番号を割り当てようとしましたが、予想とは異なる番号が見つかると思います。

floatCountries = 74,2;

この変数の値を次のようなステートメントで出力する場合:

NSLog(@"%f", floatCountries);

出力は2.0です。

Cにはコンマ演算子と呼ばれる演算子があり、それは単純ですx, y。ここで、xとyは任意の式(理想的には、互いに互換性のある型(たとえば、両方の数値))にすることができます。

コンマ演算子は、最初に左側の式を評価し、次に右側の式を評価し、それ自体が右側の式を評価します。

74,2最初に式を評価し、次に742を評価してから、に評価し2ます。したがって、変数に2int必要に応じて自動的に変換される)を割り当てます。

これをリテラルの数値で使用するのはちょっとばかげているように思えるかもしれませんが、そうです。++コンマ演算子は、 and演算子を含む式など、副作用のある式で使用するために存在します--

結果のコードが不明確であるため、コンマ演算子の使用は一般的に推奨されていません。原則として、各行は1つのことを実行する必要がありますが、などの行x = ++y, --z;3つのことを実行します。

それにもかかわらず、あなたが見つけたように、それは有効です。ただし、「未使用の値」の警告がオンになっている場合は(必要に応じて)、式の半分が実際には未使用であるため、警告が表示されます74。床にドロップします。無害ですが、これが意図したことではないという症状。

あなたが欲しいものは:

floatCountries = 74.2;
于 2013-03-03T07:34:33.870 に答える