yohhoyの日記

技術的メモをしていきたい日記

C

sizeof演算子とオペランドの評価

C C++

プログラミング言語C/C++言語では、sizeof演算子のオペランドは評価されない(evaluated)。 int a = 42; size_t n = sizeof(++a); // 式(++a)は評価されない assert(a == 42); C++11 JTC1/SC22/WG21 N3337 5/p7, 5.3.3/p1より部分引用。 In some contexts, un…

C/C++関数引数の評価順序

C C++

プログラミング言語C/C++では、関数実引数の評価順序は未規定(unspecified)となっている。標準規格における言及箇所のメモ。2018-02-02追記:C++17仕様では未規定(unspecified)から “不定順の順序付け(indeterminately sequenced)” に変更され、関数実引数の…

続 restrictキーワード

C

C99で導入された restrict キーワードに関するメモ。restrictキーワード の続き。 読込アクセスとalias restrictポインタが指すオブジェクトに対して変更(書き込み)を行わなければ、restrictポインタ同士が同一オブジェクトを指していても良い。下記コード…

電子書籍"The New C Standard"

C

C99規格書の全ての文章*1に注釈を加えた電子書籍を無料でダウンロード可能。PDF形式。1600頁超。 The New C Standard - An Economic and Cultural Commentary, Derek M. Jones 下記のamazon.comレビューにある通り、作者本人による正規配布とのこと。なにや…

restrictキーワードへの対応状況

C99で導入された restrict キーワード(→id:yohhoy:20120223)への対応状況メモ。 gcc系 gccはC99の restrict キーワードに対応している。また、C++でも利用可能な独自の __restrict__, __restrict キーワードを提供しており*1、C/C++のポインタ型と参照型お…

C標準ライブラリとC++の例外伝搬

C C++

C++例外伝搬と(C++標準規格に含まれる)C標準ライブラリの関係についてメモ。*1 C標準ライブラリ関数からは例外throwを行わない。(noexcept指定がされているとみなしてよい) ただしユーザ定義関数のコールバックを行う標準ライブラリ関数は特例。qsort, b…

restrictキーワード

C

C99で追加された restrict キーワードについてのメモ。コンパイラに対して「aliasが存在しないと仮定した最適化を許す」と伝えるためのキーワード。C99以降でのみ有効なキーワードであり、C++11現在でもC++には同キーワードが存在しない。(ただしコンパイラ…

(翻訳)C/C++のStrict Aliasingを理解する または - どうして#$@##@^%コンパイラは僕がしたい事をさせてくれないの!

元記事:Understanding C/C++ Strict Aliasing, or - Why won't the #$@##@^% compiler let me do what I need to do!, Patrick Horgan氏訳出メモ: 自分自身の理解のために日本語訳を行ったStrict Aliasing Rules解説記事。 訳文中では "aliasing/alias", "…

printfとsize_t型

C99にてsize_t型用の書式化文字列 長さ修飾子(length modifier)zが追加された。 #include <stdio.h> printf("%zu\n", sizeof(int)); なお、同時にptrdiff_t型用の長さ修飾子tも追加されている。 gcc系 gcc(glibc 2.1以降)はzに対応している。ただし、厳密なC90(-peda</stdio.h>…

gets関数の最期

C C++

C標準ライブラリにおいてバッファオーバーフロー脆弱性の代名詞とされていた関数getsは、プログラミング言語Cの最新規格C11にて標準規格から削除された。 2018-09-01追記:プログラミングC++言語においてもC++14で削除された。 #include <stdio.h> char buf[10]; gets</stdio.h>…

asmキーワードの扱いの違い

C C++

C言語とC++言語とでは、それぞれの標準規格におけるasmキーワードの扱いが異なることに気付いたのでメモ。結論を要約すると下記の通り。 Cでは予約語では無い。ただし、多くのシステムでは処理系定義であると言及。(informative) C++では予約語であり、その…

C言語の標準規格一覧

C

プログラミング言語Cに関する標準規格の一覧。 略称 国際標準規格 対応するJIS規格 C89 (ANSI X3.159-1989) C90と同一 C90 ISO/IEC 9899:1990 Programming languages -- C JIS X3010:1993 プログラミング言語C C95 ISO/IEC 9899:1990/Amd.1:1995 JIS X 3010:…