Questions tagged [c]

C言語(シーげんご)は、1972年にAT&Tベル研究所のデニス・リッチーが主体となって作ったプログラミング言語である。

C言語(シーげんご)は、1972年にAT&Tベル研究所のデニス・リッチーが主体となって作ったプログラミング言語である。
UNIXおよびCコンパイラの移植性を高めるために開発してきた経緯から、オペレーティングシステムカーネルおよびコンパイラ向けの低レベル記述ができることを特徴としている。


ここでは入門に関する書籍について説明します。

C入門

環境が見当たらずインストールに不安がある場合
やさしいC 第4版
http://www.amazon.co.jp/dp/479737098X

世界でいちばん簡単なC言語のe本―C言語の基本と考え方がわかる本
http://www.amazon.co.jp/dp/4798028843

かんたんC言語 (プログラミングの教科書)
http://www.amazon.co.jp/dp/4774142328

C初級
以下、環境やインストールについては触れない

全くCに触れたことがない場合
新版 明解C言語 入門編
http://www.amazon.co.jp/dp/4797327928

標準ライブラリまで網羅したい場合
独習C 第4版
http://www.amazon.co.jp/dp/4798115770

入門の時点でポインタについて詳しい説明が必要な場合
苦しんで覚えるC言語
http://www.amazon.co.jp/dp/4798030147

C中級、C++初級

コードの書き方に不安がある場合
C実践プログラミング 第3版
http://www.amazon.co.jp/dp/4900900648

文字列の扱いに慣れたい場合
新版 明解C言語 中級編
http://www.amazon.co.jp/dp/4797350040

ポインタをマスターしたい場合
C言語ポインタ完全制覇
http://www.amazon.co.jp/dp/4774111422

ソースファイルを分割できるようになりたい場合
新版 明解C言語 実践編
http://www.amazon.co.jp/dp/4797329955

規格に沿った学習がしたい場合
プログラミング言語C 第2版 ANSI規格準拠
http://www.amazon.co.jp/dp/4320026926

C上級

その他の言語を呼び出したい場合
C言語教科書(上達編) 誰でもわかる! C言語ベテラン技
http://www.amazon.co.jp/dp/4822284212

協調性のあるコードを書きたい場合
リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)
http://www.amazon.co.jp/dp/4873115655

C入門、C初級から1冊、
C中級、は苦手克服として1~3冊、
C上級、から時間と予算、目的に合わせてと考えています。

692 questions
21
votes
4 answers

if ((ret = func()) == -1)という書き方

C言語で関数の戻り値をチェックする方法で if ((ret = func()) == -1) という書き方があります。 これは ret = func(); if (ret == -1) と同じ意味なのですが、上記の書き方を検索して調べる時、どういうキーワードで調べればいいでしょうか? (Yoda notationなどのように、名前はあるのでしょうか? ) また、上記の書き方は、MISRACやその他コーディング規約においては、許可されたものなのでしょうか?
sevenOfNine
  • 1,206
  • 12
  • 21
18
votes
9 answers

do...while(false)の利点は何ですか

時々こういうプログラムを見かけます do { if (!hoge) break; fuga(); } while(false); これは以下のプログラムと同じではないでしょうか if (hoge) { fuga(); } 2つ目の書き方は1つ目の書き方よりわかりやすいしデバグしやすいと思いますが、1つ目の書き方には利点はありますか
12
votes
3 answers

c言語 if (a != b) と if (a =! b) の違い

表題のようにプログラム中で if(a!=b) を if(a=!b) と誤って記述した所、コンパイルはできるのですがそこでプログラムが停滞していました。 コンパイルができるということはこの記述にも意味があるのでしょうか? どのような意味なのでしょうか? 追記 for(i=0;i
NLP Lover
  • 697
  • 3
  • 8
  • 24
11
votes
4 answers

なぜスレッド間の同期にvolatileを使ってはいけない?

C言語で、2つのスレッドを同期するに、下記のようなプログラムを書きました。 volatile int hoge = 0; //... void fuga1() // スレッド1で動いている { while (1) { while (hoge == 0) // 値が変わるまで待つ sleep(1); puts("fuga1!"); hoge = 0; } } void fuga2() //…
10
votes
2 answers

C99 での文字列リテラルによる初期化について

C 言語では次の様にしてchar配列を初期化できますが、 int main(void) { char str[] = "abc"; ... } これは C99 の規格文書で 6.7.8 Initialization の paragraph 14 An array of character type may be initialized by a character string literal, optionally enclosed in braces.…
keys
  • 101
  • 3
10
votes
1 answer

strtok() が NULL を返した後、さらに strtok(NULL, ...) を呼んでもよいのか。

背景と質問 以下のようなプログラムを見掛けました。 char *token1 = strtok(str, " "); char *token2 = strtok(NULL, " "); char *token3 = strtok(NULL, " "); if(token1 == NULL) { // トークンがない場合の処理 } else if(token2 == NULL) { // トークンが1個の場合の処理 ... } else if(token3 ==…
yoh2
  • 2,348
  • 2
  • 13
  • 29
9
votes
10 answers

Cの自作関数における戻り値について

初心者な質問で申し訳ありません。 Cで自作関数を作成した場合、 戻り値で何を返すか迷ってしまいます。 戻り値の型をint型とした場合、 エラー時は-1を返すべきなのか0を返すべきなのか また、戻り値の型をchar *等ポインタ型にした場合、 エラー時は空のポインタを返せばよいのか 上記以外にもありますが、 皆さんのアドバイス、ご意見をお願いします。
nyp
  • 107
  • 1
  • 1
  • 2
9
votes
2 answers

構造体のアドレスと構造体の最初のメンバーのアドレスは同一であるとして良いか?

前に見かけたコードなんですが、 例えば(コンセプトが同じと思って下さい) struct hoge { char name[32]; //以下その他のメンバーが続く } foo[16]; のような配列があって、これをqsortを使ってnameでソートする時 比較関数で、 int cmp(const void *a, const void *b){ const struct hoge *x = a; const struct hoge *y = b; …
BLUEPIXY
  • 6,907
  • 1
  • 21
  • 34
9
votes
3 answers

C言語の標準で用意されている乱数がなぜ推奨されないのか教えてください。

C言語の標準で用意されている乱数がなぜ推奨されないのか教えてください。
user13656
  • 141
  • 1
  • 5
9
votes
3 answers

警告「xxxに代入した値は使われていない」の対処方法

環境: CやC++の開発環境 コンパイル時の警告についての質問です。 以下のテスト用関数を用意したとします。ステップ実行でvalの値をチェックするためです。 void Test_someFunc() { int val; val = getVal(); } 上記コードを含めたソースをコンパイルすると以下の警告が出ます (確認環境: C++ Buiilder…
sevenOfNine
  • 1,206
  • 12
  • 21
9
votes
5 answers

C : 配列の添字について

以下に示すコードが何故実行できるのかわかりません. (2) において、添字は-1 になっていると思いますが、何故エラーが発生しないのですか? #include #include int main() { char s[] = "hello"; int len = strlen(s); printf("len: %d\n", len); // (1) …
user11190
  • 99
  • 1
  • 3
7
votes
2 answers

malloc(0)のreallocの挙動

某所で p = malloc(n*sizeof(Type)); ... p = realloc(p, ++n*sizeof(Type)); ... free(p); のようなコード(実際のコードではありません)を見かけたんですが、 (今取り上げたい)問題はnが0から始まるってことです。 malloc(0)?と思ったので、ちょっと調べて見ました。 C99のドラフトによると、 7.20.3 Memory management functions 1 ... If the size of…
BLUEPIXY
  • 6,907
  • 1
  • 21
  • 34
6
votes
2 answers

単項プラス演算子の存在意味はなんでしょうか?

演算結果としてはなんの効果もないですよね。にもかかわらず存在する意味はなんでしょう。 強いて言えば、intやdoubleへの昇格する効果と単項マイナス演算子との対称性のためかもしれませんが 単項プラス演算子を使う必要性を感じた場面がありません。ある方がいらっしゃれば使い道をお教えください。
jsuzu
  • 1,181
  • 10
  • 24
6
votes
3 answers

char_uをuint8_tに変更する根拠

https://github.com/neovim/neovim/issues/459 に以下のコメントがあります。 We should replace most occurrences of char_u by uint8_t char_uをuint8_tに変更する利点、char_uのままだとまずい点、とはどういうものでしょうか? char_u自体はビット数(8など)がわからない、というのがまずいのでしょうか? その他、移植の関係で変更をするのでしょうか?
sevenOfNine
  • 1,206
  • 12
  • 21
6
votes
2 answers

単項演算子'-'を符号無し整数型に使用した場合について

JISX3010:2003 プログラム言語C 6.3.1.3 符号付き整数型及び符号無し整数型 整数型の値を̲Bool型以外の他の整数型に変換する場合 新しい型が符号付き整数型であって,値がその型で表現できない場合は,結果が処理系定義の値となるか,又は処理系定義のシグナルを生成するかのいずれかとする。 6.5.3.3…
nora
  • 305
  • 2
  • 8
1
2 3
21 22