![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
No.1ベストアンサー
- 回答日時:
> 文法的に (void)0 どのように解釈出来るのでしょう。
文法的には,単純に,0をvoid型にキャストしているだけです。
cast-expression: (void)0 as '(' type-name ')' cast-expression
type-name: void
cast-expression: 0 as unary-expression
unary-expression: 0 as postfix-expression
postfix-expression: 0 as primary-expression
primary-expression: 0 as constant
そして,void型への型変換は,規格 (ISO/IEC 9899:1999) の
6. Language - 6.3 Conversions - 6.3.2 Other operands - 6.3.2.2 void
に説明があり,
> If an expression of any other type is evaluated as a void expression, its value or designator is discarded.
と書かれています。
つまり,値0は単純に破棄されます。
ちなみに,全ての式文は,6.8.3 Expression and null statementの第2段落に
> The expression in an expression statement is evaluated as a void expression for its side effects.
とあるため,voidへのキャストがあるかのように扱われます。
回答有り難う御座います。
詳しいですね。規格を此処まで熟知している人は少ないと思います。
頼りになります。
英語の勉強にもなりました。
また質問したときには、宜しくお願いします。
No.3
- 回答日時:
C言語では、関数呼び出しも代入計算も、基本的に全ての文は「式」に「;」を付けたものになっています。
「func();」という文は、「func()」という式を文にしたものになります。
「b=a+1;」という文は、「b=a+1」という式を文にしたものになります。
同じように、「0;」という文は、「0」という式を文にしたものになります。
ただし、このままだと数式の値を何にも利用していませんから、
コンパイラはバグの可能性を考えて「式の結果を利用していない」という警告を出す場合があります。(例えば、「a+1;」も文としては正しいですが、何の意味もない式文ですので、記述者が間違えている可能性が高いと推測できます)
そこで、「0」という式をvoidにキャストする「(void)0」にすると、式の値を使っていないことを明示できるため、そういう警告を出さないようにできるのです。
では、非デバッグ時にassertの定義がなぜこのような形になっているかというと、
if (foo) assert(bar);
といった形でassertが使われた時に、assert の効果は無くしつつも、assertを式として成立させて、if文としての体裁は変わらないようにしているのです。
早速の回答有り難う御座います。
mtaka2さんの回答を見て下記のプログラムで試した所、コンパイラからは警告もエラーも有りませんでした。
ルネサスのマイコン用コンパイラHEWを使っています。
MISRA C と言うC言語のチェッカでは次の警告が有りました。
0; 何の副作用も無いという警告有り
1 == 1; 何の副作用も無いという警告有り
(void)0; 何の副作用も無いという警告有り
if (1) ; {}を付けた方が良いと言う警告有り
if (1){} ; 警告無し
if (1){(void)0;}; 何の副作用も無いという警告有り
(void)0 を使えば警告は出なくなる事を期待したのですが、出るようです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングペーパーテスト 次の問題の実行結果を答えろ #include int x[ ] = { 1 2022/06/16 21:49
- その他(プログラミング・Web制作) 十進BASICでの再帰についての質問です。 2 2022/11/18 09:17
- C言語・C++・C# C言語 コードを書いたのですが上手く実行出来なかったです。どこが間違ってますか? 【作成したいもの】 1 2022/05/04 11:36
- C言語・C++・C# プログラミングの授業のペーパーテスト 実行結果を答えろ #include int x[ ] = {1 3 2022/06/16 20:08
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- パスポート・ビザ 【パスポート】なぜパスポートにはVOIDのパンチ穴が開いているのですか? VOIDの 3 2023/05/11 21:25
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# C pointer? or... 2 2022/03/29 00:47
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
既定のコンストラクタがありま...
-
多重定義が起きている?--lnk20...
-
C# Controls.Addで動的に配置し...
-
【gcc・cygwin】multiple defin...
-
void*型の配列について
-
戻り値を返す関数の前に(void)...
-
プログラミング教えてください
-
typedef unsigned int UINT;が...
-
bccでエラー:メンバー関数は呼...
-
static変数の配列の初期値を空...
-
静的でないメンバ関数の呼び出...
-
const_castのつかいどころを教...
-
VC++でGetKeyboardStateがうま...
-
_beginthreadにて発生するコン...
-
int main()、void main()、void...
-
H8マイコンのシリアル通信につ...
-
LCDモニターの駆動
-
C#でラジオボタンを設定に記録...
-
C++にてtemplateで受け取った任...
-
4桁7セグでダイナミック点灯
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
既定のコンストラクタがありま...
-
【gcc・cygwin】multiple defin...
-
Notepad++の関数リスト表示の変...
-
戻り値を返す関数の前に(void)...
-
ArduinoでMouse関数を使用して...
-
C++にてtemplateで受け取った任...
-
int main()、void main()、void...
-
多重定義が起きている?--lnk20...
-
C# KeyDownイベントでショート...
-
静的でないメンバ関数の呼び出...
-
VC++でGetKeyboardStateがうま...
-
C# Controls.Addで動的に配置し...
-
gcc: incompatible pointer type
-
void*型の配列について
-
const_castのつかいどころを教...
-
C言語 ① 5秒間 1秒間隔で点滅を...
-
(void)0 はどんな意味ですか
-
TimerProc コールバック関数を...
-
H8マイコンのシリアル通信につ...
-
DLLの関数呼び出しで引数がある...
おすすめ情報