読者です 読者をやめる 読者になる 読者になる

りーまの日記

特に外向けに配信しているわけではないので読みにくいかもしれませんが参考になれば幸いです

日々気になっていたプログラムの事-1

独習C進捗 プログラム知識

おそらくこれから突発的に何度か不定期あるシリーズです
https://twitter.com/strimuer213p/status/823854746498789376

すべての始まりのツイートです

今から書くことはこのツイートのリプライから指摘をいただいた物を自分なりに調べてみました

-------1月27日----------------------------------------
Visual Studioのセキュリティ
  VSにおいて古くセキュリティが弱い(Microsoftが奨励しない)関数には
  毎回エラーメッセージが出る。(調べるとよくぶつかるのが標準ライブラリ関数で
  あるscanf()。)
  
  このエラーを防ぐ方法は二つある
    1.MSではPOSIX仕様のセキュリティに強い関数を作成しており(scanf()であるならば
     scanf_s())そちらを使う
     ・良い点
       実際にセキュリティが高くなりプログラムを安全に取り扱える
     ・悪い点
       これは Visual Studio特有のもので他のエディタ等では使えない
       (少なくとも競技プログラミングAtcoderでは「WA(Wrong Answer)」ではなく
                「CE(Compilation Error)」というエラー)
       
    2.#define _CRT_SECURE_NO_WARNINGSで「奨励しない関数である」という警告を
                                     除去する
     ・良い点
       競プロを行う上では先頭のこの文章を消去するだけでVSでプログラムの動きを確
       認しながら競プロで提出できる
     ・悪い点
       セキュリティの脆弱性は一切解決されていない
       バッファーオーバーランなど深刻なエラーが起きても奨励しない関数にはエラー検
       知機能がなく(そのため非奨励)そのまま実行しプログラムがクラッシュしたりパソコ
       ンの思わぬところに被害が出る。
    
    まとめ
     競プロを行う上では#define _CRT_SECURE_NO_WARNINGSを使う方が良さそう
     しかし、開発などを手掛けるのであればセキュリティに強い関数を使うべきである。
     
    /*すこし調べましたが文章や具体例はすべて僕なので間違いや不適切な表現はあります
     //_CRT_SECURE_NO_WARNINGSってただの臭いものには蓋をするの原理だった
     //んですね…
     //適当に調べたというか自分の経験的に2種類しか思い浮かばなかったのですが他にあ
     //りますか?
     //あと間違いがあれば教えて頂けると嬉しいです 
       
POSIX(ポシックスまたはポジックス)
  各種UNIXを始めとする異なるOS実装に共通のAPIを定め、移植性の高いアプリケーション
  ソフトウェアの開発を容易にすることを目的としてIEEEが策定したアプリケーションイン
  ターフェイス規格である。

 

ファイルのオープン
  2種類のファイルのオープンモード
   ・バイナリモード
   ・テキストモード
  
  2つの違い
   ・バイナリモード
    OS環境に依存しない
    どんな環境でも1バイトも変更せずに取り扱える

 

   ・テキストモード
    OS依存、いわゆる環境依存文字
  
   例:改行\r\n
          windowsにおいての読み込み
     ・バイナリモード
       \r\n
          ・テキストモード
       \n
          /*同じファイルなのに違う文字で保存されてしまう*/
       //参考文献

 

ディレクトリとパス
  カレントディレクトリ(現行ディレクトリ)
    コンピューティングの分野で、階層型ファイルシステムを使用している場合にそのプロセス
              が現在関連付けられている(現在の位置にある)ディレクトリの事である。windowsでは作
              業フォルダともよばれることがある。
  パス
    個々のディレクトリやファイルが、ディレクトリツリーの中のどの位置にあるか
    つまりディレクトリやファイルの住所などのような情報の事をパスと言う

 

  絶対パス表記
    ルートディレクトリ「/」からのカレントディレクトリをたどる
    /Ri_ma/C/wakaranai

 

  ソリューション
    問題を解決するためのコンピュータシステム

 

C言語の文字
  C言語の文字をintで扱うのはアセンブリレベルではどうせintで扱うため
    またchar型がint型と比較するときchar型の値が自動的に同等のint型に変換される
                                                                                                (integral promotion)
  
  /*C言語高級言語*/
   //ソースプログラム→コンパイラ→オブジェクトプログラム==機械語==アセンブリレベル

 

   /*int型は計算が一番早い型*/
      //いくつか調べましたがshort int型の方が速い(単純にint=32ビット,short=16ビット)
   //というのをいくつか見かけたので…
   //「前置詞 int型」以外の型(char型やfloat型)と比べれば速いみたいです

 

integral promotion
  int型よりrankの低い整数値型の値はすべての値が表現できるのであればint型に変換できる

 

  
典型的なビット長
        型      ビット                     最小範囲
                   char    8                       -128~127
         signed char     8                       -128~127
     unsigned char     8                            0~255
                short int     16                       -32,768~-32,767  
    signed short int     16                             -32,768~-32,767
unsigned short int     16                                       0~65,535
                     int   32(稀に16)  -2,147,483,648~2,147,483,647
             signed int     32(稀に16)    -2,147,483,648~2,147,483,647 
         unsigned int     32(稀に16)          0~4,294,967,295
                 long int     32                 -2,147,483,648~2,147,483,647
     signed long int     32                 -2,147,483,648~2,147,483,647
 unsigned long int     32                                       0~4,294,967,295
              float    32                                       小数精度6桁
              double   64               小数精度10桁
         long double   80            小数精度10桁

 

     /*C言語の規格では*/
      //char<=short<=int<=long<=longlong
                   //longlongはちょっとわかりませんでした…
      //大きさを超える値を代入すると
      //char ch=128 printf("%d",ch);→→-128
                   //char ch=129 printf("%d",ch);→→-127
                   //char ch=130 printf("%d",ch);→→-126
      //範囲を超えると最小値からスタートする
      //VS、wandboxも同じ結果

 

<stdint.h>
  C言語の標準ヘッダ
  指定の幅を持つ整数型を宣言し、それらの宣言に対応するマクロを定義します
  例:
   typedef==int8_t→signed char型
        解釈
     8バイト(上記に記したバイト数)と一致するのはchar型
    
      typedef==int32_t→int
        解釈
     int型の32バイト(上記に記したバイト数)よりint型

 

sizeof演算子
     sizeofに渡された型や変数のメモリサイズを調べる物



    
ストリーム
  ・バイトストリーム
    バイトのシーケンスとしてファイルを扱う
    プログラム内ではストリームはバイトシーケンス
  ・ワイドストリーム
    柔軟なストリームは、エンコーディング規則の広い範囲を持つことができ
    る汎用的なマルチバイト文字のシーケンスとしてファイルを扱います



   /*ここらへんはMSDNを書き写しましたが具体的にストーリムとは何かからわかりません*/
    //ストリームとはユーザ・プロセスとデバイスまたは疑似デバイス間の二重結合のこと
    //である…

 

YSRさんのまとめ
  1.ビット演算→uint_ナントカ
  2.unsignedなループ変数→size_t
       3.64bitなど長い幅を必要とする変数→int64_t
       4.その他基本的な整数→int

 

ビット演算
  固定長のワードなどといった「ビットの塊」に対して各のビットすべてに対する論理演算を
  いっぺんい行う演算操作である

 

ループ変数
  for(i=0;i<10;i++){}
     一般的にこのfor文においてiをループ変数という
    
    /*白山風露さんの部分はまったく何も…*/
     //とりあえずint型とchar型は注意

 

まとめ
  今作られている計算機は数学的な整数を格納できないから場合によっていろんな整数型が必
       要だから場合を問わず一気にintを使うのは現実の複雑さから逃げるということだけ恥であり役
       に立たない

 

  /*今までint型,char型と参考書に書いてあることだけを無意識に書き写していたので耳が*/

   //痛いですね…