• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:複合代入演算子について)

複合代入演算子について

このQ&Aのポイント
  • 複合代入演算子についての質問です。
  • 具体的なコード例として、_stprintf_s関数を使用して文字列を書き込む場合に、代入演算子+=を使用した場合と、等価の代入文を使用した場合の動作について質問しています。
  • また、enum定義や条件分岐などについても言及しています。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

この例では間違いでは無いですが、変に複雑に考えすぎてる気がします。 もっと単純に right = _stprintf_s( c + len, size_t(SIZE_ - len), 何々 ); len = len + right ; と考えれば、「演算前」かどうかわかるのでは? あと「この例では間違いでは無い」としました。 厳密には、 a += b ; a = a+b ; は「等価ではありません」 等価で無い例) *(pa ++ ) += b ; *(pa ++ ) = *(pa ++ ) + b ;

LongSecret
質問者

お礼

ありがとうございます♪ これが気になった時は >right = _stprintf_s( c + len, size_t(SIZE_ - len), 何々 ); >len = len + right ; このように書けば間違いないと私も思ったのですが、上のように書けるならばそのためだけに変数を一つふやすのは表記としては冗長のような気がしたので… >あと「この例では間違いでは無い」としました。 >厳密には、 >a += b ; >a = a+b ; >は「等価ではありません」 上記の場合はマクロ的な話ではなく、 私が書いた int a=0, b=1; より、aとbが同じint型と書いてあるので問題はなしでしょう。 もし その表記がなく、あるいはマクロなどであれば(また、C++でのoperator等はなしとしても) >*(pa ++ ) += b ; >*(pa ++ ) = *(pa ++ ) + b ; 等はおっしゃる通り等価ではないですね。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • TCHAR文字列?の特定部分の数字文字をint型の数値に変える方法

    TCHAR文字列?の特定部分の数字文字をint型の数値に変える方法ですが どうすればよいでしょうか? int test(LPCTSTR s) { int a, b, c, d; /* TCHAR?型文字列を数値のintに変える方法???  a = 12の前2桁 b = 34の2桁 c = 5の最後の1桁 */ d = a + b - c; return d; } ret = test(_T("12345")); の場合、retに41が返ってきてほしい。

  • C言語にて、XORの演算時間を取得するには?

    題名の通りです。 C言語で、XOR命令の演算時間を取得しようとしています。演算時間を取得する関数部分は下の通りで、a^=b, b^=aをひたすら繰り返すことで、命令の演算時間を取得する、というものです。この方法を使って、ADD命令については演算時間を取得できました。しかし、XORについては、計測時間がほぼゼロになり、XORが動いていないようです。 その理由は、同じ値をXORすると元に戻るというXORの原理のため、コンパイラの最適化によりfor文内のXOR命令が消えてしまったからだと考えられます。 かといって、t1とt2にvolativeを付けて宣言すれば、最適化によって消去はされませんが、volativeの性質上、メモリアクセスの時間を取得することになってしまいます。 どうすれば、XOR命令のみの演算時間を取得できるでしょうか。 アイディアや指摘がありましたら、どうかご教授下さい。 -------------------------------------------------------------- #define ADD(a, b) a+=b #define XOR(a, b) a^=b /* 10回反復するマクロ */ #define repeat10(S) S S S S S S S S S S /* 各命令の演算時間を計測する関数 */ void operation_test( unsigned int *out, unsigned int p1, unsigned int p2, int its) { /* volatileを付けた宣言だと、t1とt2はメモリに取られるため、目的を達成できない */ unsigned int t1 = p1; unsigned int t2 = p2; /* itsは反復回数 */ for(int i=0; i<its; i++){ /* いずれかの行を選択する。ADDはきちんと演算されているよ */ /* うだが、XORは最適化により消去されてしまっているらしい */ repeat10(ADD(t1, t2); ADD(t2, t1); ) //repeat10(XOR(t1, t2); XOR(t2, t1); ) } out[0]=t1+t2; } --------------------------------------------------------------

  • C#でビット演算はできますか?

    C#2008で、以下のソースを動かして、OK 2が表示されるのを期待していたのですが、演算子&をintとbool型の演算子に適用できません。 となります。 何か良い方法はありますか? int a = 32 | 16; int b = 8; int c = 16; if (a & b != 0){ MessageBox.Swho("OK 1"); } if (a & c != 0){ MessageBox.Swho("OK 2"); }

  • operator演算子のnewオーバーロード

    こんばんは。 C++言語の勉強をしています。 new演算子をオーバーロードしたいのですが、引数としてvoid*を渡したかったのですが、 エラーC2821が出力されてできませんでした。 エラー内容が第一引数がsize_tでなければならない理由が分からない ので質問しました。 ご教授お願いします。

  • インクリメント/デクリメント演算子を使った計算

    Javaでのインクリメント演算子とデクリメント演算子を 使った計算についての質問です。 int a = 10; int b = a++ + ++a + --a - a--; このコード処理後の変数a,bの値の計算方法(考え方)が つかめず苦戦しています。 解答はa=10,b=22だそうです。 ちなみに例えば次のコードのb=a++;のように 右辺と左辺が1つずつの場合は理解しやすいです。 int a = 1; int b = 0; b = a++; //処理A 処理A後の変数a,bの値は b=aをした後でa=a+1を行うので a=2,b=1 となることは理解できます。 ご教授のほどよろしくお願いします。

  • _tcscat がうまくいきません(VC++2008)

    以下のように入力し、ビルドすると 「error C2664: 'wcscat' : 1 番目の引数を 'LPCTSTR' から 'wchar_t *' に変換できません。」となり、うまくいきません。 ダイアログに「テストです。」と表示させたいです。一体どうしたらよいのでしょうか?ご教授ください~。 環境は、WindowsXP SP2 & Visual C++ 2008 Express Edition です。 なお、文字セットは「Unicode 文字セットを使用する」に設定してあります。 //----------------------------------------------------------- #include <Windows.h> #include <tchar.h> INT WINAPI WinMain( HINSTANCE hInst,HINSTANCE,LPSTR,INT){ LPCTSTR str1 = _T("テスト"); LPCTSTR str2 = _T("です。"); _tcscat( str1, str2 ); MessageBox(NULL,str1,_T("Dialog"),MB_OK); return 0; }

  • maxの演算を教えてください

    引数の中でそれより小さい数が存在しない数を選び出す(要するに最大値なんですけど)、max()と言う記号がありますよね?これの演算の際の基本法則を簡単にまとめて教えていただきたいです。例えば、a<c,b<cならばmax(a,b)<cなどです。わかる方回答お願いします。

  • 論理演算子の変数等を結ぶ個数について質問

    int a=1,b=0,c=0のとき a==0 && (b==0 || c==0) a==0 && b==0 || c==0 の2つの論理式あったとします 質問:論理演算子は、必ず「左右2つの変数しかつなげない」のですか? 例えば、前者の論理演算子なら、&&は、a==0とb==0をつないでる。 後者の論理演算子なら、||はb==0 とc==0をつないでる。 質問2:質問1の仮説が正しいとすると、前者も後者も論理演算子&&は、論理演算子||とb==0を共有してますよね?

    • ベストアンサー
    • Java
  • c++ TCHARで文字化け

    TCHARはUNICODEが扱えるときいたので早速つかってみた。以下は引数を表示するプログラムである。 Visual C++ Express Editionを使った。 #include <stdio.h> #include <tchar.h> int _tmain(int argc, _TCHAR* argv[]) { int i=0; while(i<argc){ _tprintf(_T("%s\r\n"),argv[i++]); } return 0; } しかし上記プログラムに日本語の引数をわたすと文字化けするではないか。なでしょうか?

  • Objective-c 3項演算子で代入できない

    Objective-c 2.0で3項演算子を用いてプロパティに代入演算子で代入を行おうとすると Expression is not assignableエラーになります。 なぜでしょうか? 1.エラーになる例 UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; BOOL flag = YES; flag == YES ? label.text = @"a" : label.text = @"b"; // ここでエラー 2.3行目をsetTextメッセージに置き換えるとエラーは出なくなります。 flag == YES ? [label setText:@"a"] : [label setText:@"b"]; // これはOK 3.if文に置き換えてもエラーは出ません。 if(flag == YES) label.text = @"a"; // これもOK else label.text = @"b"; // これもOK 1.と2.の書き方は等価だと思っていたのですが、どうやら等価ではないということは わかりました。では、どう違うのかというと、そこまでの理解には自力では至れませんでした。 1.だとnot assignableなのに3.だと問題ない理由もわかりません。 何か理解のためのヒントをいただけないでしょうか? よろしくお願いします。 環境: XCode Version 4.3.2 (4E2002) Apple LLVM Compiler 3.1