web-dev-qa-db-ja.com

+ =と= +のC代入演算子の違いは何ですか

=++=(および他の代入演算子)に違いがあるのではないかと思っていました。私は試しましたが、両方とも同じことをしました。違いがあるのですか、それとも慣習がありますか?私のコンパイラは標準をチェックしないので、両方とも機能しますか?

編集:間違えました。テスト中に悪い入力を使用したため、両方が同じことをしていると思うようになりました。彼らは2つの異なるものであることが判明。

+=演算子加算右辺値に右辺値

x += y;
x = x + y;

=+単にassigns右辺値に左辺値

x =+ y;
x = +y;
x = y;
6
Michael

現代のC、または適度に古いCでは、+=は複合代入演算子であり、=+は2つの別個のトークンとして解析されます。 =および+。句読点トークンを隣接させることができます。

だからあなたが書いた場合:

x += y;

それは同等です

x = x + y;

xが1回だけ評価されることを除きます(より複雑な式の場合は問題になります)。

あなたが書く場合:

x =+ y;

それは次のように解析されます

x = + y;

+は単項プラス演算子です。

非常に Cの初期バージョン(1970年代中頃、1978年にK&R1が発表される前)は、複合割り当てに異なるシンボルを使用していました。最新のCが+=を使用する場合、初期のCは=+を使用しました。初期のCには単項+演算子はありませんでしたが、単項-演算子があり、=-を使用すると問題が発生しました。プログラマーはx=-yを意味するつもりでx = -yと書くが、それはx =- yと静かに解釈された。この問題を回避するために、1978年以前に言語が変更されました。 1999年の終わり頃、私は=-のあいまいな使用について警告するコンパイラ(VMS上のVAXC)を使用しましたが、古い意味を使用していました。あなたがいくつかのvery古いソフトウェアやハードウェアで遊んでいる愛好家でない限り、それは今心配するべきではありません。

11
Keith Thompson