マガジンのカバー画像

C言語

63
C言語に関するあれこれ
運営しているクリエイター

2023年1月の記事一覧

C言語教室 第12回(続) - 回答提出

C言語教室 第12回(続) - 回答提出

こちらの記事の課題回答です。

以下、
・引数チェックなし
・const なし
・エラー処理なし
です!

では、順番に。

課題1コード

int area_rect(int side1, int side2){ return (side1 * side2);}

テストと結果

int area = area_rect(4, 5);printf("area of rectangle (4

もっとみる
C言語には仕様が明確にされていない部分がある

C言語には仕様が明確にされていない部分がある

先日来より、コンパイラ依存についてしつこく書いてきました。

実は、C言語の仕様には明確にされていない部分があります。

関数引数の評価順序

これがまさに「C言語の仕様として明確にされていない部分」にあたります。

「関数引数の評価順序」

や、あるいは英語でも

「order of evaluation function parameters」

で検索するといくつもヒットします。

曰く。

もっとみる
C言語コンパイラ依存した話の続編「gcc はどうコンパイルするのか」

C言語コンパイラ依存した話の続編「gcc はどうコンパイルするのか」

こちらの記事の続きです。

もう、いつまでやってんのよっていう感じだけど。
ようやく、 gcc です。
そして、これが gcc が出力したアセンブラです。

_main:LFB1445: .file 1 "../src/HelloWorld.cpp" .loc 1 15 0 .cfi_startproc leal 4(%esp), %ecx .cfi_def_c

もっとみる
C言語コンパイラ依存した話の続編「Visual Studio 2019 はどうコンパイルするのか」

C言語コンパイラ依存した話の続編「Visual Studio 2019 はどうコンパイルするのか」

最早、毒食らわば皿までといった心境です。
再び、この記事の続き。

前回は clang コンパイラについて解析しました。
ならば、 Visual Studio 2019 はどうなのか。
そういうことが気になる(笑)。

今回は、その Visual Studio 2019 のお話です。

※以下、VS = Visual Studio 2019 の意。

VS が出力したアセンブラ以下が、VS が出力

もっとみる
バグが私に教えてくれたもの

バグが私に教えてくれたもの

失敗は成功のもとという言葉があります。プログラミングにおいて「バグ」こそが失敗そのものです。そこから教わることは多い。学ばない手はありません。

コピーしてシンボルを変更するのを忘れたとか、== を = としてしまったとか、そういったケアレスミス的なものも少なくはありませんが、もっと設計の根本に関わるようなものもあります。「設計の根本」といっても必ずしも複雑なものとは限りません。関数内のアルゴリズ

もっとみる
C言語コンパイラ依存した話の続編「clang はどうコンパイルするのか」

C言語コンパイラ依存した話の続編「clang はどうコンパイルするのか」

こちらの記事の延長戦です。

というわけで(どういうわけ?)、 clang コンパイラが吐き出したアセンブラを解析してみました。

結論から言うと、clang コンパイラの場合は次のようになります。

引数 i 、 j は三項演算する前に待避しておく。

「j--」(後置デクリメント)は、 j-- する前の値を別のレジスタに待避する。

まず、clang が出力したアセンブラを見てみます。スマホ版

もっとみる
C言語でコンパイラ依存した話

C言語でコンパイラ依存した話

久しぶりでした。
コンパイラ依存。

コンパイラによって動作が変わることを言います。C言語では昔からありますが、私自身お目にかかったのは久しぶりです。

コードはこちらの記事のものです。

いつもC言語コードを書きあって楽しませていただいてます。

ちょっと、リンク先のコードを再掲させていただきます。
#define MAX(x,y) ((x) > (y) ? (x) : (y))int mai

もっとみる
C言語教室 第11回 - プリプロセッサとマクロ 答案提出

C言語教室 第11回 - プリプロセッサとマクロ 答案提出

課題えーっと。
書いたのがこのコード。
#include <stdio.h>#define MAX(x,y) ((x) > (y) ? (x) : (y))int main(){ int a, b; int max_ab, max_ab_inc_f, max_ab_inc_b; a = 537; b = 9274; max_ab = MAX(a, b);

もっとみる
C言語教室 第10回 文字種判定 答案提出

C言語教室 第10回 文字種判定 答案提出

今回も考えてみました。

コード#include <stdio.h>#include <string.h>#include <ctype.h>/* 英小文字を英大文字に書き換える */void to_strupper(char str[]){ int len = strlen(str); int i; for (i = 0; i < len; i++) { s

もっとみる
プログラマーがプログラム中に考えていること

プログラマーがプログラム中に考えていること

先日書いたコードです。
と言っても Python チュートリアルをC言語に焼き直しただけですど。

プログラムは、次のようなもの。

こじんまりとしたプログラムです。
Python で書くとコメント込みで 20 行。
C言語で 33 行( { や } だけの行が 12 行!)。

これが初版です。
#include <stdio.h>#include <stdbool.h>bool is_pri

もっとみる
Prime numbers sieve C言語化編

Prime numbers sieve C言語化編

先日、こちらの記事で素数生成イテレータを紹介しました。 Python ドキュメントにあったチュートリアルを解説したものです。

最後にこう書きました。

「C言語で書くとどうなるかしら」

というわけで、C言語で書いてみた。

コード#include <stdio.h>#include <stdbool.h>bool is_prime(int number){ int i; for (

もっとみる