ものすごく根本的なことなのですが
下の「何々」に相当する部分はLPCTSTR単独か、それと_stprintf_sの書式に見合った引数のリストを正しく表記されているとして
また、合計がSIZE_を超える恐れはないことが分かっているとして

enum { SIZE_=30 };
TCHAR c[SIZE_];
int len = _stprintf_s( c, SIZE_, 何々 );

if ( 何らかの条件 ) len += _stprintf_s( c + len, size_t(SIZE_ - len), 何々 );

len += _stprintf_s( c + len, size_t(SIZE_ - len), 何々 );





といったのは問題ない方法でしょうか?


int a=0, b=1;
a+=b;



a = a + b;

と等価になることから

len += _stprintf_s( c + len, size_t(SIZE_ - len), 何々 );



len = len + _stprintf_s( c + len, size_t(SIZE_ - len), 何々 );

と等価と考えて良いことが保証され
右辺の
len + _stprintf_s( c + len, size_t(SIZE_ - len), 何々 );

の時点では3か所ともlenは必ず演算前の数値になる、よって
未定義動作ではない、と考えて良いのでしょうか?

A 回答 (1件)

この例では間違いでは無いですが、変に複雑に考えすぎてる気がします。



もっと単純に

right = _stprintf_s( c + len, size_t(SIZE_ - len), 何々 );
len = len + right ;

と考えれば、「演算前」かどうかわかるのでは?


あと「この例では間違いでは無い」としました。
厳密には、
a += b ;
a = a+b ;
は「等価ではありません」

等価で無い例)
*(pa ++ ) += b ;
*(pa ++ ) = *(pa ++ ) + b ;
    • good
    • 0
この回答へのお礼

ありがとうございます♪

これが気になった時は

>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 ;

等はおっしゃる通り等価ではないですね。

お礼日時:2011/04/17 03:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング