「C言語」の版間の差分

提供: Wikinote
移動: 案内検索
(定数)
(定数)
行46: 行46:
 
|-
 
|-
 
! <code>long</code>
 
! <code>long</code>
| align="right" | 123456789'''L'''
+
| align="right" | <code>123456789'''L'''</code>
 
|-
 
|-
 
! <code>unsigned</code>
 
! <code>unsigned</code>
| align="right" | 123'''U'''
+
| align="right" | <code>123'''U'''</code>
 
|-
 
|-
 
! <code>unsigned long</code>
 
! <code>unsigned long</code>
| align="right" | 123456789'''UL'''
+
| align="right" | <code>123456789'''UL'''</code>
 
|-
 
|-
 
! <code>double</code>
 
! <code>double</code>
| align="right" | 123.456
+
| align="right" | <code>123.456</code>
 
|-
 
|-
 
! <code>unsigned double</code>
 
! <code>unsigned double</code>
| align="right" | 123.456'''L'''
+
| align="right" | <code>123.456'''L'''</code>
 
|-
 
|-
 
! <code>float</code>
 
! <code>float</code>
| align="right" | 123.456'''F'''
+
| align="right" | <code>123.456'''F'''</code>
 
|-
 
|-
 
! 8 進数
 
! 8 進数
| align="right" | '''0'''123
+
| align="right" | <code>'''0'''123</code>
 
|-
 
|-
 
! 16 進数
 
! 16 進数
| align="right" | '''0x'''335F
+
| align="right" | <code>'''0x'''335F</code>
 
|-
 
|-
 
! 16 進数 <code>unsigned long</code>
 
! 16 進数 <code>unsigned long</code>
| align="right" | '''0x'''12AB'''UL'''
+
| align="right" | <code>'''0x'''12AB'''UL'''</code>
 
|-
 
|-
 
! 文字定数
 
! 文字定数
| align="right" | 'a'
+
| align="right" | <code>'a'</code>
 
|-
 
|-
 
! 8 進数ビットパターン
 
! 8 進数ビットパターン
| align="right" | '\013'
+
| align="right" | <code>'\013'</code>
 
|-
 
|-
 
! 16 進数ビットパターン
 
! 16 進数ビットパターン
| align="right" | '\x1A'
+
| align="right" | <code>'\x1A'</code>
 
|-
 
|-
 
! 文字列定数
 
! 文字列定数
| align="right" | "hello, world"
+
| align="right" | <code>"hello, world"</code>
 
|-
 
|-
 
|}
 
|}

2009年2月3日 (火) 20:45時点における版

C 言語再考。

覚え書き

printf のフォーマット

% で始まり、変換指定子で終わる。以下のプログラムで実験。

#include <stdio.h>

int main(void) {
    float f;

    printf("1234567890 1234567890\n");
    printf("---------------------\n");
    f = 123.456;
    printf("%f %f\n", f, -f);               // デフォルト
    printf("%.2f %.2f\n", f, -f);           // 小数点以下桁 (精度) 指定
    printf("%10f %10f\n", f, -f);           // 最小幅指定
    printf("%10.2f %10.2f\n", f, -f);
    printf("%010.2f %010.2f\n", f, -f);     // 0 で埋める
    printf("%-10.2f %-10.2f\n", f, -f);     // 左揃え
    printf("%+10.2f %+10.2f\n", f, -f);     // 必ず符号をつける
    printf("%*.2f %*.2f\n", 15, f, 15, -f); // 引数による幅指定
    printf("%*3$.2f %*3$.2f\n", f, -f, 20); // 引数による幅指定 (引数指定)
    printf("%.*3$f %.*3$f\n", f, -f, 10);   // 引数による精度指定 (引数指定)

    return 0;
}

実行結果は下記のようになる。

$ gcc -o printf printf.c; ./printf
1234567890 1234567890
---------------------
123.456001 -123.456001
123.46 -123.46
123.456001 -123.456001
    123.46    -123.46
0000123.46 -000123.46
123.46     -123.46   
   +123.46    -123.46
         123.46         -123.46
              123.46              -123.46
123.4560012817 -123.4560012817

定数

定数の型
long 123456789L
unsigned 123U
unsigned long 123456789UL
double 123.456
unsigned double 123.456L
float 123.456F
8 進数 0123
16 進数 0x335F
16 進数 unsigned long 0x12ABUL
文字定数 'a'
8 進数ビットパターン '\013'
16 進数ビットパターン '\x1A'
文字列定数 "hello, world"

※大文字、小文字の区別はない。(U, L, X はそれぞれ u, l, x でも同じ。)

  • 列挙定数 (enum) の初期値は 0。
  • 文字列定数はコンパイル時に連結できるので、以下のような書き方も可能である。長い文章を出力するときなどに便利。OSS のソースを見ても、\ で折り返してるケースが多いが、こちらの方がインデントなどなにかと使いやすいように思える。
printf("aaaaaaaaaaaaaaa"
       "bbbbbbbbbbbbbbb"
       "ccccccccccccccc\n");
// print "aaaaaaaaaaaaaaabbbbbbbbbbbbbbbccccccccccccccc\n"

その他 (細かいこと)

  • #define 行の末尾にはセミコロンはいらない
  • extern宣言であって、定義ではない。つまり、領域の確保などは行われない。別ファイルで定義される変数などを利用する際に使う。疑問:ヘッダファイル中で extern 宣言した場合、定義するファイルからそのヘッダを include してもよいのか。

テクニック

下位 8 ビットマスク

x = x & ~0xFF;