C言語にてWindowsアプリケーションを作成する際に疑問に思ったif文の動作について

このQ&Aのポイント
  • C言語にてWindowsアプリケーションを作成していますが、if文で行われている比較について疑問があります。
  • 具体的には、変数の頭に「!」が付くことでどのような動作になるのか知りたいです。
  • 初歩的な質問で申し訳ありませんが、教えていただけると助かります。
回答を見る
  • ベストアンサー

C言語にてwindowsアプリケーションを作成しています。

C言語にてwindowsアプリケーションを作成しています。 サンプルソースを見ていて疑問に思った箇所がありましたので知っている方がいらっしゃれば、 教えて頂きたいと思い質問いたします。 以下のソースにて、 1 int PASCAL WinMain(HINSTANCE hInst,HINSTANCE hPrev,LPSTR lpCmdLine,int CmdShow) 2 { 3 if ( !hPrev ) { 4 // 処理省略 5 } 6 // 処理省略 7 } 3行目のif文にてどのような比較が行われているのでしょうか? 変数の頭に「!」が付く事でどのような動作になるのか疑問に思いました。 初歩的な質問で申し訳ありませんが、よろしくお願いいたします。 以上です。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

 こんばんは。  if(!hPrev)は、hPrevの値が0であれば「4」が実行され、hPrevの値が0以外であれば「4」は実行されません。  「!」を取り除いてif(hPrev)にすると、hPrevの値が0以外であれば「4」が実行され、hPrevの値が0であれば「4」は実行されません。  if構文の話はこれ位に留めておきます。  WinMainの第2パラメータhPrevは、windows3.xで使用されていたパラメータです。windows95以降は、常に0で固定されていますので、処理をする必要はありません。  詳細は以下です。  http://msdn.microsoft.com/ja-jp/library/cc438750(VS.71).aspx  http://msdn.microsoft.com/ja-jp/library/cc438719(v=VS.71).aspx  大昔のwindowsプログラムの中には、今現在のマイクロソフトが「使用する事は望ましくない」としている、win32APIの呼び出しや、関数フラグを含んでいる可能性があります(MSDNで確認できます)。  大昔のwindowsプログラムのソースを参考にする時には、上記の事を念頭に入れておくと良いでしょう。

19820202
質問者

お礼

詳しく解説していただきありがとうございます。

その他の回答 (1)

  • SaKaKashi
  • ベストアンサー率24% (755/3136)
回答No.1

!は否定形ですね。hPrevが0の場合を判断してます。

関連するQ&A

  • VS2010 C++ エラーについて

    Visual Studio2010のC++を使用しているのですが、DLLにメッセージボックスを使用したいと思っています。 .cppに #include <windows.h> int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance , LPSTR lpCmdLine, int cmdShow) { MessageBox(NULL,"○○○","△△△",MB_OK); return 0; } 上記のようなソースコードを使って見ると、○○○と△△△の部分でエラーを吐きます。 どのようにすれば改善されるか教えてください。

  • HINSTANCEの型

    LPSTR は char* なので、 int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE hPrevInstance , LPSTR lpCmdLine ,int nCmdShow ) を int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE hPrevInstance , char* lpCmdLine ,int nCmdShow ) と書き換えてもコンパイルできます。 HINSTANCEはvoid *型だという記述を見たのですが、void *で書き換えてもエラーがでてしまいます。 どうしたらよいのでしょうか。

  • Windowsアプリケーションをどうしても作りたいのですが

    /* OS==XP コンパイラー==Borland C++5.5 */ #include<windows.h> int WINAPI WinMain( HINSTANCE hInstance , HINSTANCE hPrevInstance , LPSTR lpCmdLine , int nCmdShow ) { return 0; } で Error: 外部シンボル '_main' が未解決(C:\BORLAND\BCC55\LIB\C0X32.OBJ が参照) となるのでexeファイルができません。 解決法を是非教えてください。 C言語歴2日+1H

  • 画像が出力されません

    画像出力するには int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow); から引数"lpCmdLine"を使うことにより画像が出力できる事を聞いたのですが本当でしょうか? うまく出力できません どのようにしたらよいのか具体的にソースをつけて教えてください。 画像はraw画像で出力します

  • 【Windowsアプリ】ファイルのドラッグ&ドロップについて

    C言語でのWindowsアプリの勉強をしています。(始めたばかりです) ***.exeにファイルをD&Dした際、 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 上記の"lpCmdLine"にファイルパスが入るのはわかったのですが、別のファイルパスの取得方法として、 1.***.exeを実行 2.ウィンドウ表示 3.ウィンドウ内にファイルをD&D 4.ファイルパスを取得 の方法がわかりません。 DragAcceptFiles()や、DragQueryFile()を使うと思うのですが、WinAPIの使い方がいまいち良くわかっていない状況です。 自分で勉強するべきというのは承知の上でのお願いしたいのですが、どなたか出来ればサンプルソースなど教えて頂けるとうれしいです。 環境はテキストエディタでソースを作成→Borland C++ Compiler 5.5でコンパイルしています。

  • 外部シンボル "_main"は未解決です

    「LIBC.lib(crt0.obj) : error LNK2001: 外部シンボル "_main" は未解決です」というエラーが発生しましたが、何をみればいいのかわかりません。int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )がソースについています。

  • C++とインラインアセンブラでのポインタ値が違う

    C言語で取得した配列変数の先頭ポインターとインラインアセンブラで取得したポインターが異なる現象が起きました。 2個のソースファイルを持つ下記プログラムで、pointer1とpointer2が異なる原因を教えてください。 ただし、提示のソースはあくまで、見本で実際には多くの変数やコードを記述しています。 開発環境はWin7(64bit)、VC++2010無償版です。 main.cpp #include <windows.h> int *disp; int *pointer1; int *pointer2; int data[8]; void disp_sub(); int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow) { _asm{ mov disp,offset disp_top call disp_sub jmp pgm_end disp_top: lea eax,data mov pointer1,eax } pointer2=&data[0]; if(pointer1 != pointer2)Beep(3000,1000); _asm ret pgm_end: return 0; } sub.cpp extern int *disp; void disp_sub() { _asm{ call disp } }

  • 変数の内容がコロコロ変わる、原因を教えてください。

    VC++2010でプログラムしていますが、下記変数TESTの内容がプログラム実行中にある時点で勝手に変更されてしまいます。もちろんプログラム中に変数TESTを変更する記述は何処にも書いていません。 64bit環境での変数設定の注意点を教えてください。 long TEST=0; long TEST1; char LOOP=1; int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { while(LOOP) { if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) ) { TranslateMessage( &msg );//翻訳する DispatchMessage( &msg );//急送する } TEST1 = 7777777; if(TEST)Beep(3000,100); }//while(LOOP) return msg.wParam; }//WinMain

  • Windowsゲームプログラミングを始めたのですが

    最近ゲームのプログラムを始めた者です。 C言語でWindowsプログラムを書き始めたのですが、最初の宣言を行った時点でコンパイル時に大量のエラーが出てしまいました。 ↓が内容です。 #include<windows.h> #include<stdio.h> #include<stdlib.h> int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){ } 使用OSはVistaです。 急いではいないので、どなたか解決法を知っている方、ご指導お願いします。

  • C言語で黒い画面が出る

    gcc使ってC言語を勉強していますが、スタートmainをwindowsにしても黒い画面が出てきます。これを消すことはできませんか。やりたいことは単にメッセージボックスを表示して簡単なファイル入出力するだけです。ソースコードは以下 #include <windows.h> #include <tchar.h> int WINAPI WinMain( HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { MessageBox( NULL, _T("Hello, Windows!"), _T("sample"), MB_OK); return 0; }