- ベストアンサー
コーディング作法の異議あり
正親町(@Ohgimachi)の回答
- 正親町(@Ohgimachi)
- ベストアンサー率43% (110/252)
良いコーディングとは 作成者以外のプログラマーがデバックや修正をし易いコーディング の事をさします。 デバッグや修正の実作業においては、 ソースファイルの検索 というのが必須になります。 エディタまたはツール(awkなど)を使用する場合 正規表現で該当箇所を検索するのですが 簡単に検索可能であれば作業労力を減らすことができます。 質問の適合例では 変数xの0判定をしているコードを検索しようとすれば x [!=]= 0 と入力すれば、複数の判定も含めて確実に捕捉できます。 例 (x != 0 || x == 5) 不適合例のように記述してしまうと switch文のようなものも検索にかかるうえに (x || x == 5) のような文の検索に手間がかかることになります。 要約すると 判定文のコーディングを統一すると、機械的な検索の手間が減るということです。 if (x) のような記述は変数がbool型に統一するべきです。 瑣末のような話とか思うかもしれませんが こういう無駄な労力の排除の積み重ねが 納期の短縮、プログラムの品質向上に結びつくのです。 おまけ 変数の0判定は論理積(AND)以外にも 差(SUB)の演算も多用されます。 CPUによっては、データの移動のみでも フラグがセットされる機種(ARMなど)もあります。 どれが最適かはコンパイラに任せておけばよいのです。
関連するQ&A
- コーディングについて。
コーディングとは、コンピュータにコード入力する事を言います。 転じてプログラミングの意味で使われますが、プログラムコードを書くこと全般を言います。 プログラムコードはふつうソースコードと呼びます。 ソースコードとは普通はテキストファイルの形で保存されるコードのことです。 アセンブリ言語もテキストファイルに書き込んでゆきます。 マシン語は、基本的にはテキストファイルではなく、実行形式のバイナリファイルそのままをバイナリエディタや専用エディタで編集します。 C言語中のインラインアセンブラのように、そこにマクロ命令でマシン語を書き込む事も出来るには出来ます。 勿論、マクロアセンブラ(MASM)のようなアセンブリ言語でもマクロ命令でマシン語コードを記述出来ます。 大昔まで言えば、穿孔テープを使っていた頃のコンピュータなら、テープに穴を空ける作業もコーディングです。 穿孔テープは穴の有無を2進数で示していて、そこに必要に応じてチェックサムなどを付けたものですが、これは紛れもなくマシン語です。 これら全てを総じてコーディングと呼びます。 ですから、アセンブリ言語もマシン語もそれを書くことはコーディングです。 以下四つの質問に答えていただけると幸いです。 ①テキストファイルとは何でしょうか? ② マシン語は、基本的にはテキストファイルではなく、実行形式のバイナリファイルそのままをバイナリエディタや専用エディタで編集します。 C言語中のインラインアセンブラのように、そこにマクロ命令でマシン語を書き込む事も出来るには出来ます。 勿論、マクロアセンブラ(MASM)のようなアセンブリ言語でもマクロ命令でマシン語コードを記述出来ます。 ここの意味がわかりません。もう少し詳しく教えて頂きたいです。 ③チェックサムとは何でしょうか? よろしくお願いします。 と ④テキストは文字コードが割り当てられた、16進数でいう0x20~7f のものです。 マシンコードは8bitなら全部 0x00~oxff 全部の値があり得ます よろしくお願いできればと思います。
- 締切済み
- その他([技術者向] コンピューター)
- あなたのC言語コーディング規約
勤務先・学校・趣味でC言語を使用してプログラムをしている方の多くは組織内で決めているコーディング規約に沿ってプログラムをしていると思います。 しかし、全てに関して規約化されていることは少なく、ある程度プログラマの裁量に任せていることがあると思います。 そこで、質問です。 「あなたの中で決めているコーディング規約は何ですか?」 「また、その理由は何ですか?」 私が決めているコーディング規約を一例挙げると以下の通りです。 (基本は他人が見ても直ぐに理解できるように心がけてます。) ------ □変数名の前には必ず型を現す文字を書く 理由:観ただけで型が分かるから。 例 :int型は、iData char配列は、stData ポインタは、pData □関数の復帰値は、一旦必ず変数に代入する。 理由:代入しないとデバックがしにくい。 例 :iRetCode=func(); switch(iRetCode){ case文 } の、ように色んな値を試すときに不便。 □if文には、極力「!」(NOT)は使用しない。 理由:複数の論理和・積などが入った場合ややこしいので elseで代用する。(真の時の処理はわざと書かない) □if文の判定には必ず定数値を左辺に持ってくる。 理由:if(iData=0)とかの"=="を"="にしてしまうミスを防ぐため。 (コンパイラによっては、警告が出るものもありますが…) 例 :if(0=iData)など □while(1)は、基本的に使用しない。 理由:無限ループに陥らないようにするため。 ------
- 締切済み
- C・C++・C#
- C90とC99の計算結果の違い?
C言語の質問です。 gcc version 4.3.2 (Ubuntu 4.3.2-1ubuntu12) 以下のプログラムをgccでコンパイル・実行すると(1)に入り,"a"が出力されます。unsigned intの計算なのでラップアラウンドが生じtest=4294716272となるのは私の期待どおりです。 ただ、gcc -std=c99でコンパイル・実行すると(2)に入り,"b"が出力されました。c99でコンパイル・実行すると計算結果がなぜ異なっているのかが分かりません。 long test = 0; unsigned int x = 184; unsigned int y = 251208; test = (x-y); if(test == 4294716272){ printf("a");// (1) }else if(test == -251024){ printf("b"); // (2) }
- ベストアンサー
- C・C++・C#
- コーディングが悪いというのは?
http://oshiete1.goo.ne.jp/kotaeru.php3?q=1590132 のNo5の方のおっしゃっている意味が良く分からなくて質問します。 VB任せの変換になるので、コーディング的にはあまり良くありません。 というのは、コンパイラ(VBもコンパイラと言うのでしょうか?)に任せたプログラムはやめたほうがいいぞ と受け取りました。 実際、C言語だろうがVBだろうがコンパイルする場合にはコードがどのようにアセンブラに変換され、機械語に変換されたかしっかり確かめる必要のある人(技術がある人)は最初からアセンブラで書いたほうがいい様に思います。 その手間が嫌なのでVBを使っている人がformatとvalを使い分ける明確な理由がイマイチ良く分かりません。 実行速度の問題なのならCを使えば良いだろうし、何がそこまで違うのかも理解できません。 (宣言せずに使用するよりは)int long stringをしっかり分けて使うのがいいぞ というのと、valを使うのは良くないぞ と言うのはまったく違う意味ですよね? aをintegerで宣言してa=val(b)等と書けば自然とintegerになるのではないのですか? 結局、val()とformat()をきっちり使い分けるためにはそれぞれの関数のプログラムを理解する必要があると思うのですが、それぞれ関数の内容は公開されているのでしょうか?(簡単に調べられるのは使用方法ぐらいのような気もするのですが。)
- ベストアンサー
- Visual Basic
- 低次元なコーディング方法について
私は一通り書籍でC言語の基礎を勉強しただけの初心者プログラマです。 もっと実力を付けるためにアルゴリズム関連の書籍をいくつか読み始めました。 これならソースを読む力も一緒に鍛えられると思ったからです。 その中で素数を表示するプログラムに興味を持ち自力で一から組んでみました。 (途中でどうしても分からず参考にする部分もあったのですが…) 私のコーディング手順は 1.UMLのアクティビティ図で大まかな処理を確認する。 2.if文だけで一通りの処理を記述。 3.while文を使って繰り返しの処理を追加する。 4.何度もうまくいかずにそのたびに修正していく。 というものです。 1.の部分は大量に書籍が出ているので勉強できるのですがUMLの性質上 それをコーディングしていく解説はどうしてもCのソースを書くこととは次元が違うようです。 かなり低次元なことだからでしょうか、解説している本にも出会えません。 前置きが長くなりました。 今回教えていただきたいのは ・アクティビティ図などで記述したものをソースコードに落とし込む というかなり低レベルな部分での方法です。 私はオブジェクト指向はまだ勉強していないので Cでその過程などを書いていただけると幸いです。 どうやったらgoto文やフラグを使わずにソースを書けるか、 コツなどあったらぜひ教えてください。 アドバイスの参考になればよいと思い、私が書いた素数表示プログラムの一部を紹介させていただきます。 /**********************************************************/ /* 素数を格納する配列を受け取り最後に-1を格納する関数 */ /* 効率的な演算のために乗除演算回数を表示もおこなう */ /**********************************************************/ #define END (-1) #define MAX 1000 void prime_assess(int a[]) { int j=0; //ループ用のカウンタ int x=3; //検証値 int element_no=1;//配列の中の素数の個数 int arithmetic_no=0;//乗除演算回数 while(x<MAX){ j=0; arithmetic_no++; while(x % a[j] !=0 && a[element_no-1] != x){ arithmetic_no++; if(a[j]-a[j] >= x){ a[element_no++] = x; }else{ j++; } } x += 2; } a[element_no] = END; printf("乗除演算回数は%dでした。\n",arithmetic_no); } 先ほどの1~4のプロセスで作りました。 できるだけ無駄な演算を避けてみたつもりですがいかかでしょうか。 フラグなどを避けるよう、かなり時間をかけて書いたプログラムです。 乗除演算回数はおそらく2636回になっています。 自分以外の方にソースを見ていただける機会がないものですから、 これはおかしいぞというところも書いていただけたらうれしいです。 皆様からのアドバイスをお待ちしております。
- ベストアンサー
- C・C++・C#
- bsearch関数の呼び出しで
C言語の深いところまで理解しようとしてます。今まで使わないだろうと思っていた関数へのポインタ なのですが、 2分探索のところで bsearch関数というのが出てきました。 この関数は第5引数に比較関数を引数にするのですが p = bsearch(&ky, x, nx, sizeof(int), (int (*)(const void *,const void *))int_cmp ); という形でサンプルソースには載っています。 この (int (*)(const void *,const void *))int_cmp の部分なのですが、まず戻り値をキャストするなら int (*)ではなく(int *)ではないでしょうか。 それとint_cmpは比較関数なのですが、引数が左側に来る、というところが納得できません。 ちなみにソースファイルをcppのままだとコンパイルできませんでした.cに拡張子を直したらコンパイルできました。 説明が足りないところがあったら指摘してください。お願いします。
- ベストアンサー
- C・C++・C#
- C言語のプログラムについて質問
明解C言語という書籍に 大きい方を表示するプログラム #include <stdio.h> int maxof(int x, int y) { if (x > y) return (x); else return (y); } int main(void) { int na, nb; puts("二つの整数を入力してください。"); printf("整数1:"); scanf("%d", &na); printf("整数1:"); scanf("%d", &na); printf("大きいほうの値は%dです。\n", maxof(na, nb)); return (0); } の関数maxofを利用し、 int max4(int w, int x, int y, int z) { return (maxof(maxof(w, x), maxof(y, z))); } を挿入して変えれば四つの整数から最大値を求められるとのことですが、 コンパイルがうまくいきません。 関数maxofのwとx,yとzをそれぞれ比較し最大値を求めてさらにmaxof(w, x)とmaxof(y, z)を比較して最大値を求めるということですよね?ですので、 maxof(w, x) { if (w > x) return (w); else return (x); } maxof(y, z) { if(y > z) return (y); else return (z); を挿入しようとしたらmaxofはすでにありますというようなことが表示されてだめでした。 また、 int maxof(maxof(int w, int x), maxof(int y, int z)) { if (w > x) return (w); if (w < x) return (x); if (y > z) return (y); if (y < z) return (z); if (maxof(w, x) > maxof(y, z)) return (maxof(w, x)); if (maxof(w, x) < maxof(y, z)) return (maxof(y, z)); } としてみましたがやはりだめでした。 前のページの説明を読み返したりネットで調べてもわかりませんでした。 何がわからないのかがわからないのでもうお手上げです。 長くなってすいません プログラム例と説明をお願いします。
- ベストアンサー
- C・C++・C#
- C言語における定数の使用方法
こんにちは。 今日質問したいのは、タイトルにありますように、C言語における「定数」の使い方についてです。 私は現在、Visual C++を用いてC言語のプログラミングを勉強しているのですが、条件文(if文)に定数を用いてコーディングを行おうとしても、どうしてもエラー表示が出て、うまくコンパイルすることができません。 具体的には、 if(No>=1 && No<=10){ //具体的な処理部分 } というif文を、予めヘッダファイル内にて定義した定数 #define start 1; #define stop 10; を用いて次のように、 if(No>=start && No<=stop){ //具体的な処理部分 } コーディングしたいと考えています。 しかし、これをコンパイルするとエラーが発生してしまいどうにもうまくいきません。 また、定数ではなく数字で記述するとうまく回ります。 別のところで定数を、 wk = start; のように代入で使用しているのですが、そこではなにも問題がありません。 いったい何が間違っているのか、どのようにすればうまくいくのかを教えていただきたいと考え、書き込ませていただきました。 皆様、どうぞよろしくお願いします。
- ベストアンサー
- C・C++・C#
- cではよくてc++ではダメな理由
#include <stdio.h> #include <stdlib.h> int main(void) { int *x; x = calloc(1, sizeof(int)); if (x == NULL) puts("記憶域の確保に失敗しました。"); else{ *x = 57; printf("*x = %d\n", *x); free(x); } return 0; } 上のソースなのですがcallocの戻り値がvoidなのでintにはキャストしてくれみたいなことを コンパイラに言われます。 cではコンパイルできてc++ではコンパイルできないのはなぜでしょう。
- ベストアンサー
- C・C++・C#
- ポインタ…(゜Д゜≡゜Д゜)?
え~C言語初心者です。 ポインタ、文字列等の比較を教えて下さいm(._.)m ペコッ 下記ソースでおかしいところがあれば指摘お願いします。 (1)数値の比較 int i = 10; if(i == 10){処理} (2)文字の比較 char c = 'c'; if(c == 'c'){処理} (3)文字列の比較 char *c = "abc"; if(c == "abc") {処理} ↑これだとポインタと文字列の比較になるんですよね? if(0 == strcmp("abc",c)){処理} ↑この書き方で問題ないのでしょうか? if(0 == strcmp("abc",*c)){処理} ~~ だとダメなのでしょうか? ※int型のポインタを使う場合 int *i = 0; if(0 == *i){処理} になるのでしょうか?
- ベストアンサー
- C・C++・C#
お礼
回答有難うございました。