回答編集履歴

3

CのコードをC99以降でのより「望ましい」コードへと書き換えた。

2025/05/23 07:16

投稿

cametan
cametan

スコア17

test CHANGED
@@ -5,33 +5,37 @@
5
5
  ```C
6
6
  #include <stdio.h>
7
7
  #include <stdlib.h>
8
+ #include <inttypes.h>
8
9
 
9
- int main(void)
10
+ int main(void)
10
11
  {
11
- int a = 10;
12
+ int16_t a = 10;
12
- int *p = &a;
13
+ int16_t *p = &a;
13
- int *k = &a;
14
+ int16_t *k = &a;
14
- printf("%d %d\n", *p, *k); /* 10 10 */
15
+ printf("%" PRId16 " %" PRId16 "\n", *p, *k); /* 10 10 */
15
16
  return EXIT_SUCCESS;
16
17
  }
18
+ ```
17
19
 
18
- ```
19
20
 
21
+
20
22
  ```C
21
23
  #include <stdio.h>
22
24
  #include <stdlib.h>
25
+ #include <inttypes.h>
23
26
 
24
- int main(void)
27
+ int main(void)
25
28
  {
26
- int a = 10;
29
+ int16_t a = 10;
27
- int *p = NULL;
30
+ int16_t *p = NULL;
31
+ p = &a;
28
- int *k = NULL;
32
+ int16_t *k = NULL;
29
- p = &a, k = &a;
33
+ k = &a;
30
-
31
- printf("%d %d\n", *p, *k); /* 10 10 */
34
+ printf("%" PRId16 " %" PRId16 "\n", *p, *k); /* 10 10 */
32
35
  return EXIT_SUCCESS;
33
36
  }
34
37
  ```
38
+
35
39
  は同じ結果になる、ってのは分かるかな。
36
40
  まぁ当たり前だけどさ。
37
41
 
@@ -50,7 +54,7 @@
50
54
 
51
55
  って事になる。
52
56
  前者のアスタリスクは宣言時に「ポインタ型」を生成する為の機構、後者のアスタリスクを[**間接参照演算子**](https://daeudaeu.com/c-address-operand/)っつーんだ。
53
- **Cの極悪仕様**は、全く違う機能に同じ記号(アスタリスク)を採用している事となり、混乱の元なってる。
57
+ **Cの極悪仕様**は、全く違う機能に同じ記号(アスタリスク)を採用している事となり、混乱の元なってる。
54
58
 
55
59
  つまり、貴方のように(貴方が悪いわけじゃない)、
56
60
 
@@ -68,38 +72,41 @@
68
72
  と言う意味なんだ。
69
73
 
70
74
  なお、本当の事を言うと、僕はCは全然得意じゃないんだけど、細かい事を言う人は、与題のコードを次のように書くと思う。
75
+
71
76
  ```C
72
77
  #include <stdio.h>
73
78
  #include <stdlib.h>
79
+ #include <inttypes.h>
74
80
 
75
81
  int main(void)
76
82
  {
77
- int a = 10;
83
+ int16_t a = 10;
78
- int *p = &a;
84
+ int16_t *p = &a;
79
- int *k = NULL; /* ポインタ変数宣言時は必ずNULLで初期化する */
85
+ int16_t *k = NULL; /* ポインタ変数宣言時は必ずNULLで初期化する */
80
86
  k = &a;
81
- printf("%d %d\n", *p, *k); /* 10 10 */
87
+ printf("%" PRId16 " %" PRId16 "\n", *p, *k); /* 10 10 */
82
88
  return EXIT_SUCCESS;
83
89
  }
90
+ ```
84
91
 
85
- ```
86
- 多分、絶対「ポインタ変数だけ」で宣言しない。必ず```NULL```**で初期化**する。
92
+ 多分、「ポインタ変数だけ」で宣言しない。必ず```NULL```**で初期化**する。
87
- 基本的にCはアセンブリ言語に毛が生えた程度の言語なんで、ポインタ変数の初期値が「何でも良い」的なコーディングは、バグの元なん避けるんじゃないだろうか。
93
+ 基本的にCはアセンブリ言語に毛が生えた程度の言語なんで、ポインタ変数の初期値が「何でも良い」的なコーディングは、バグの元なん避けるんじゃないだろうか。
88
94
  結果、Cプログラマはこっちの記述形式
89
95
 
90
96
  ```C
91
97
  #include <stdio.h>
92
98
  #include <stdlib.h>
99
+ #include <inttypes.h>
93
100
 
94
101
  int main(void)
95
102
  {
96
- int a = 10;
103
+ int16_t a = 10;
97
- int *p = &a;
104
+ int16_t *p = &a;
98
- printf("%d\n", *p);
105
+ printf("%" PRId16 "\n", *p);
99
106
  return EXIT_SUCCESS;
100
107
  }
108
+ ```
101
109
 
102
- ```
103
110
  を好むんじゃなかろうか。一々宣言時に```NULL```で初期化しといて、改めて代入、ってのは面倒くさいからね。
104
111
  ただ、貴方のように初心者で、「書き方を学んでいる」最中なら、どうしてもポインタ変数「だけ」を宣言する場合、```NULL```で初期化するクセは付けておいた方がいいと思う。
105
112
  その方が意味は分かりやすくなるしね。
@@ -109,20 +116,21 @@
109
116
  ```C
110
117
  #include <stdio.h>
111
118
  #include <stdlib.h>
119
+ #include <inttypes.h>
112
120
 
113
121
  int main(void)
114
122
  {
115
- int a = 10;
123
+ int16_t a = 10;
116
- int* p = &a; /* アスタリスクはintの方に付ける */
124
+ int16_t* p = &a; /* アスタリスクはintの方に付ける */
117
- printf("%d\n", *p);
125
+ printf("%" PRId16 "\n", *p);
118
126
  return EXIT_SUCCESS;
119
127
  }
128
+ ```
120
129
 
121
- ```
122
130
  宣言時のデータ型の方にアスタリスクを付ける。「機能が違うんだから書き方も違うべき」って事だな。
123
- も、これもC言語のクソ仕様で(笑)、```int *p;```と言う宣言と```int* p;```と言う宣言の意味が全く同じ、ってのはヘンなんだけどね(笑)。
131
+ っとも、これもC言語のクソ仕様で(笑)、```int *p;```と言う宣言と```int* p;```と言う宣言の意味が全く同じ、ってのはヘンなんだけどね(笑)。
124
132
 
125
- なお、本当はこういう説明はご法度なんだけど、敢えて「教育用言語」として設計されたPascalなんかだと、与題のようなコードはこう書く。
133
+ なお、本当はこういう説明はご法度なんだけど、敢えて「教育用言語」として設計されたPascalを使うと、与題のようなコードはこう書く。
126
134
  Pascalではポインタ絡みはキャレットを使う。
127
135
 
128
136
  ```Pascal

2

マークダウンを追加

2025/05/22 16:07

投稿

cametan
cametan

スコア17

test CHANGED
@@ -83,7 +83,7 @@
83
83
  }
84
84
 
85
85
  ```
86
- 多分、絶対「ポインタ変数だけ」で宣言しない。必ず**NULLで初期化**する。
86
+ 多分、絶対「ポインタ変数だけ」で宣言しない。必ず```NULL```**で初期化**する。
87
87
  基本的にCはアセンブリ言語に毛が生えた程度の言語なんで、ポインタ変数の初期値が「何でも良い」的なコーディングは、バグの元なんて避けるんじゃないだろうか。
88
88
  結果、Cプログラマはこっちの記述形式
89
89
 
@@ -100,8 +100,8 @@
100
100
  }
101
101
 
102
102
  ```
103
- を好むんじゃなかろうか。一々宣言時にNULLで初期化しといて、改めて代入、ってのは面倒くさいからね。
103
+ を好むんじゃなかろうか。一々宣言時に```NULL```で初期化しといて、改めて代入、ってのは面倒くさいからね。
104
- ただ、貴方のように初心者で、「書き方を学んでいる」最中なら、どうしてもポインタ変数「だけ」を宣言する場合、NULLで初期化するクセは付けておいた方がいいと思う。
104
+ ただ、貴方のように初心者で、「書き方を学んでいる」最中なら、どうしてもポインタ変数「だけ」を宣言する場合、```NULL```で初期化するクセは付けておいた方がいいと思う。
105
105
  その方が意味は分かりやすくなるしね。
106
106
 
107
107
  あと、Cが得意で大好きな人とか、あるいは教科書だと圧倒的に与題のような「ポインタ変数宣言」の書き方をするんだけど、僕のようにCがあまり得意じゃない人間とか、あるいはC初心者には次のような書き方の方が向いてると思う。
@@ -120,7 +120,7 @@
120
120
 
121
121
  ```
122
122
  宣言時のデータ型の方にアスタリスクを付ける。「機能が違うんだから書き方も違うべき」って事だな。
123
- 最も、これもC言語のクソ仕様で(笑)、int *p;と言う宣言とint* p;と言う宣言の意味が全く同じ、ってのはヘンなんだけどね(笑)。
123
+ 最も、これもC言語のクソ仕様で(笑)、```int *p;```と言う宣言と```int* p;```と言う宣言の意味が全く同じ、ってのはヘンなんだけどね(笑)。
124
124
 
125
125
  なお、本当はこういう説明はご法度なんだけど、敢えて「教育用言語」として設計されたPascalなんかだと、与題のようなコードはこう書く。
126
126
  Pascalではポインタ絡みはキャレットを使う。

1

言語名を明示した。

2025/05/22 15:57

投稿

cametan
cametan

スコア17

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  当然、
4
4
 
5
- ```ここに言語を入力
5
+ ```C
6
6
  #include <stdio.h>
7
7
  #include <stdlib.h>
8
8
 
@@ -17,7 +17,7 @@
17
17
 
18
18
  ```
19
19
 
20
- ```ここに言語を入力
20
+ ```C
21
21
  #include <stdio.h>
22
22
  #include <stdlib.h>
23
23
 
@@ -68,7 +68,7 @@
68
68
  と言う意味なんだ。
69
69
 
70
70
  なお、本当の事を言うと、僕はCは全然得意じゃないんだけど、細かい事を言う人は、与題のコードを次のように書くと思う。
71
- ```ここに言語を入力
71
+ ```C
72
72
  #include <stdio.h>
73
73
  #include <stdlib.h>
74
74
 
@@ -87,7 +87,7 @@
87
87
  基本的にCはアセンブリ言語に毛が生えた程度の言語なんで、ポインタ変数の初期値が「何でも良い」的なコーディングは、バグの元なんて避けるんじゃないだろうか。
88
88
  結果、Cプログラマはこっちの記述形式
89
89
 
90
- ```ここに言語を入力
90
+ ```C
91
91
  #include <stdio.h>
92
92
  #include <stdlib.h>
93
93
 
@@ -106,7 +106,7 @@
106
106
 
107
107
  あと、Cが得意で大好きな人とか、あるいは教科書だと圧倒的に与題のような「ポインタ変数宣言」の書き方をするんだけど、僕のようにCがあまり得意じゃない人間とか、あるいはC初心者には次のような書き方の方が向いてると思う。
108
108
 
109
- ```ここに言語を入力
109
+ ```C
110
110
  #include <stdio.h>
111
111
  #include <stdlib.h>
112
112
 
@@ -125,7 +125,7 @@
125
125
  なお、本当はこういう説明はご法度なんだけど、敢えて「教育用言語」として設計されたPascalなんかだと、与題のようなコードはこう書く。
126
126
  Pascalではポインタ絡みはキャレットを使う。
127
127
 
128
- ```ここに言語を入力
128
+ ```Pascal
129
129
  program foo(input, output);
130
130
  var
131
131
  a : integer;