パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

スラドに聞け:いま使っている言語の仕様、把握している?」記事へのコメント

  • 十数年仕事で(アマ時代を入れると20年以上)使っていたのに知らなかったので数日はまった。

    バグったコードからエラー原因を簡素化したテストコードは以下。
    float型(i)とint型(k)で1ずつ加算していって異なったら
    標準エラーに出力。 

    #include <stdio.h>
    int main(){
      float i;
      int k;
      i=0;
      for(k=0;k<=16777217;k++){
        if(k != (int)i) fprintf(stderr,"%i %i\n",k,(int)i);
        i += 1;
      }
      return 0;
    }

    • by Anonymous Coward on 2016年08月24日 17時24分 (#3069105)

      型付きでintだから問題ありませんが、ループの終了条件に等号を使用してはいけないとかですね。
      誤差でループ回数が変わったり無限ループに陥ったりします。

      親コメント
      • わたしの場合ですが、ロジックが不自然でなければ、整数型でも、等号より大なりなどの比較演算子を使うようにしています。

        一応、コードの変更で加算が入るかも、という正当な理由はあるのですが、どちらかというとパラノイアな「なんとなくこっちのほうが安心」という気持ちに従っているだけの気もします。

        // などと書いていたら、『「等号に掛からなくなるような当初想定しなかった変更があっても、とりあえずエラーにならない」コーディングは逆に、のちのち大きなバグを生む種になりかねないのでは?』と不安になってきたぞ、と。

        親コメント
      • by Anonymous Coward

        問題なのは
        i+=1;
        だと思われ

      • by Anonymous Coward

        Cのfloat, doubleについての等号は丸め誤差を考慮してなかったような気がする。
        FORTRANだと考慮してくれる。でも浮動小数点に等号は使わないな。

        • by Anonymous Coward

          C ではないですが、、昔々 Logitech の Modula-2 を使ってプログラムを組んでいる時に、
          2つの float型変数の値を printf() で確認すると両方とも同じ値なのに等号が成り立たなくて発狂しそうになりました。

吾輩はリファレンスである。名前はまだ無い -- perlの中の人

処理中...