ID登録せずに、無料で質問できる♪ 教えて!gooアプリ>>

たとえば以下のようなif文で、A B C が評価される順番は
言語の規約上、明確になっているのでしょうか?

if ( A && B && C ) { }

また例えば A, B, C の順番に評価されるとして、B が
FALSE の場合は C を評価する必要はありませんが、
この場合、Cは評価されないことは言語規約上、明確に
なっているのでしょうか?

手元のコンパイラで試した結果では
評価順は A -> B -> C
で B で FALSE を返すようにしたら C は実行されませんでした。
ただ、これが実装依存か、言語の標準仕様かという点が
気になっています。

このQ&Aに関連する最新のQ&A

A 回答 (7件)

「A,B,Cの順に評価され、AがFALSEならB,Cは評価されず、AがTRUEでBがFALSEならCは評価されない」が標準仕様です。



論理AND演算子、論理OR演算子は左から右に評価され、第1オペランドだけで値が決定すると、第2オペランドの評価は行われません。

http://www.microsoft.com/japan/developer/library …
http://okuyama.mt.tama.hosei.ac.jp/unix/C/slide2 …
http://www.st.rim.or.jp/~phinloda/cqa/cqa10.html …
    • good
    • 0

> 逆にこれら以外は(最適化とは無関係に)不定となっています.


","演算子も左から評価されると規定されています。
ただし同じ","でも、関数の引数の評価順序は規定されていませんのでご注意を。たとえば、
f( g(x), (t=2, t+3), h(x) );
で、第2引数は必ず5になりますが、
gとhのどちらが先に呼び出されるかはわかりません。
    • good
    • 0
この回答へのお礼

多くの回答ありがとうございました。
大変参考になりました。

お礼日時:2005/04/12 19:25

オペランドの評価順序が決まっている演算子は


&&, || (第1オペランド→第2オペランドの順で, 第1オペランドで値が決まるなら第2オペランドは評価しない) と
?: (第1オペランド→第2オペランドまたは第3オペランドの順)
だけで, 逆にこれら以外は(最適化とは無関係に)不定となっています.
    • good
    • 0

ちょっと気になったので投稿させていただきます。



> 順序をかえる場合があります。
確かに、意味が変わらない範囲内で「内部的には」実は評価の順序が変わっている、というのは今回の件に限らず最適化では普通にあることですが、
今回の話は、No.1~No.3の方の答えられたような順序で評価をしているように「外部からは」見えるという話であって、最適化による評価順序の変更とは切り分けたほうがよいように思います。
    • good
    • 0

みなさんは、a,b,cの順に評価するとかかれていますが


実は、昔、古いコンパイラ等では、強力な最適化を
実現するために、同じ結果になることが確定された
場合、順序をかえる場合があります。

例えば・・・・Z80 (16bitレジスタが3つ)を例にします。
 unsigned a,b,c; /* unsigned int */
 a=23513;
 if(a > 20000) {
  b=15325;
  if(b>10000) {
   c=31252;
   if (a && b && c) {
のような場合、実はレジスタ上に残っている数字は
b と c と 比較用の 10000 だけになります。
そうすると、最適化する上で、最初に b と c を
最初に比較することで、メモリからの読み出しの分
最適化することができます。
    • good
    • 0

#1の方が回答されている通り、「A,B,Cの順に評価され、Aが偽ならB,Cは評価されず、Aが真でBが偽ならCは評価されない」のが標準仕様です。



通常、演算子のオペランドの評価順序は(演算子の優先順位とは関係なく)不定ですが、&&や||演算子等は例外的に評価順序が決められています。
厳密に言えば、||や&&演算では、第一オペランドの評価の直後が副作用完了点となっています。以後、詳しく調べたい場合は「副作用完了点」で調べてみてください。

なお、C++で&&や||演算子を多重定義した場合には、こうした動作にはなりませんので要注意です。
    • good
    • 0

>たとえば以下のようなif文で、A B C が評価される順番は


>言語の規約上、明確になっているのでしょうか?

はい。「==」、「&&」などは演算子と呼ばれ、
優先順位が決められています。
慣れてくれば演算子の優先順位もある程度わかって
きますが、全部覚える必要はないでしょう。
()で優先順位を明確にするのも一つの手です。

http://www.bohyoh.com/CandCPP/C/operator.html
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q【C言語】if文内の演算子の優先順位について

【C言語】if文内の演算子の優先順位について

こんにちわ。初めて質問を投稿させて頂きます。
宜しくお願い致します。

【環境】
OS:Windows XP(SP3)
コンパイラ:Visual C++ 6.0
CPU:AMD Athlon X2 4200+

【質問】
私は下記のプログラムを実行しました
---------------------------------
【プログラム】
#include <stdio.h>

int main( void )
{
int i = 1;
int j = 2;
printf( "i = %d\n",i );
printf( "j = %d\n",j );
if( (i = 0) && (j = 200) == 200 ){
printf( "\n(1)-----------------------------\n" );
printf( "i = %d\n",i );
printf( "j = %d\n",j );
}
printf( "\n(2)-----------------------------\n" );
printf( "i = %d\n",i );
printf( "j = %d\n",j );
return 0;
}
【出力結果】
i = 1
j = 2

(2)-----------------------------
i = 0
j = 2 //(※)

---------------------------------

私は【出力結果】(2)のj = 2という出力結果(上記(※)の行)は
j = 200にならないとおかしいと思っております。
なぜなら、私は【プログラム】内のif文「if( (i = 0) && (j = 200) == 200 )」
の判定手順が下記の様になると考えているからです。

 (1)i = 0を実行
 (2)j = 200を実行
 (3)(i = 0)の判定実行
  →判定の結果「0」なので&&の右側の判定「(j = 200) == 200」
   を行うまでも無くif文全体の判定がFALSE。

しかし、実際は「j = 200」が実行されてないので、上記(2)と(3)の
判定手順が逆転している様に見えます。
C言語の優先順位を見ると「&&」や「==」よりも「()」の方が高いと
記憶してるので、(2)→(3)の順に実行されないとおかしいと思ってます。

しかし、私の予想した結果と実際の出力結果が異なるので私の演算子の優先順位
やif文内での判定手順の理解に間違いがあると考えています。

出来ましたらどの点が間違っているのかご教授願えませんでしょうか?

宜しくお願い申し上げます。

【C言語】if文内の演算子の優先順位について

こんにちわ。初めて質問を投稿させて頂きます。
宜しくお願い致します。

【環境】
OS:Windows XP(SP3)
コンパイラ:Visual C++ 6.0
CPU:AMD Athlon X2 4200+

【質問】
私は下記のプログラムを実行しました
---------------------------------
【プログラム】
#include <stdio.h>

int main( void )
{
int i = 1;
int j = 2;
printf( "i = %d\n",i );
printf( "j = %d\n",j );
if( (i = 0) && (j = 200) == 200 ){
printf( "\n(1)...続きを読む

Aベストアンサー

if文内に記述された代入式が評価よりも先に実行されると考えている部分が間違いです。

実際の動作の流れは、

if (A&&B) の形なのでまずAを評価する必要がある
Aは(i=0)なので、iに0を代入し0を評価する値とする
0は偽なので、Bは評価せずに終了する。

という形です。Bに書かれた(j=200)という代入式は、Bが評価された場合のみ実行されます。

Qmain関数終了時のreturnの意味は?

質問の題名通り、main関数終了時のreturnの意味が知りたいです。いつもは参考書に書いてある通り、return 0とやっていたのですが、参考書のサンプルプログラムでreturn 1というのがでてきた為、少し混乱しました。
参考書に説明が載っていないのでmain関数内でのreturnの意味をご教授願いたいです。よろしくお願いいたします。

Aベストアンサー

# 4です。

まず、0を返そうが、1を返そうが、そのプログラム自体の内部的な動作は通常変わりません。
戻り値で動作が変わる可能性があるのは「そのプログラムを呼び出したプログラム側」です。

例えば、make から呼び出された場合にそのプログラムが0以外が返したら、makeは「そのプログラムは失敗した」と考えて、処理を中断したりします。(続けて欲しいなら「成功」を返す、こういうために使います)
コマンドラインからあなたが手で入力したのなら、何も起きないかもしれません。

1を伝えられたOSが何をするかは環境(OS)によります。
gccは、Windows版もLinux版も各UNIX版もあるようなコンパイラですから、その版によって違う可能性があります。
ちなみに、手元の Minimalist GNU for Windows では 1 は EXIT_FAILURE でした=つまり前述のような失敗。
別のOS上のgccでは別の値にポートされている可能性も否定はできません。

C言語が保証しているのは、EXIT_SUCCESSを返したとき、その環境では成功と判断してくれるだろう値を返すことと、EXIT_FAILUREのときは失敗と判断してくれるだろう値を返すことだけです。
0は通常EXIT_SUCCESSですが、1はEXIT_FAILURE とは限りません(現実的には 0 と 1 が大半だと思いますが、EXIT_FAILUREが-1とかでも違反ではないです)。
但し、実際に判断できるかはOSにもよりますし、呼び出したプロセスがどう判断するかにもよります。

なお、Windows や Linux, その他私の知っている UNIX では、1を返されたからといって必ず何かが行われるということはありません。
前述のように、別のプログラム等から呼び出された場合に、そのプログラムが失敗と判断して何か処理を行う可能性はありますが、これらはあくまで呼び出し元のプログラムによります。
ITRON等の組込みOSでは、main が値を返す事は通常ありません。

憶測ですが、参考書のサンプルで return 1;となっているのは、例えば argv が求めているものと違うとか、fopen に失敗したとか、そういうケースではありませんか。
そういう異常処理が発生した場合に、もしも呼び出したプログラムがいたらそれを伝えられるように、EXIT_SUCCESS (0)以外の値を返すのは慣習です。
具体的にどんな値を返すかは、プログラムの設計次第になってしまいますが、1や-1を返したり、失敗原因ごとに決めた値を返したりします。
汎用性を重視するならEXIT_FAILURE等もありますが、知名度もやや低いですし、0以外なら何でもいいという認識の人も多いように思いますので、サンプルは単に1を返しているのではないかと。

# 4です。

まず、0を返そうが、1を返そうが、そのプログラム自体の内部的な動作は通常変わりません。
戻り値で動作が変わる可能性があるのは「そのプログラムを呼び出したプログラム側」です。

例えば、make から呼び出された場合にそのプログラムが0以外が返したら、makeは「そのプログラムは失敗した」と考えて、処理を中断したりします。(続けて欲しいなら「成功」を返す、こういうために使います)
コマンドラインからあなたが手で入力したのなら、何も起きないかもしれません。

1を伝えられたOSが...続きを読む

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

Qprintf による16進表示について

C言語初心者です。

今作っているプログラムで、データを16進形式で表示しようとしています。
大体このような感じです。

/*入力時*/
char buf[5]={0x4e,0x94,0xa0,0x2b,0x78}

/*出力時*/
for (i = 0; i < 5; i++) {
printf("0x%02x\n",buf[i])
}

実際には入力後にある処理によってbufは更新されるのですが、printfの出力結果として、

0xffffff4e
0x94
0xffffffa0
0x2b
0x78

というように、'ffffff'が付加したものがいくつか出力されてしまいます。
これはどういった意味を持つのでしょうか?

なんか初心者ならではの漠然とした質問ですいません。。。

Aベストアンサー

出力は、
0x4e
0xffffff94
0xffffffa0
0x2b
0x78
ではありませんか?
char が符号付(-128~127)のため、0x80~0xffは負の数とみなされます。printfの引数になる時に 符号付charは符号付intに変換されますが、このCコンパイラの場合は、int が4バイトcharが1バイトのため、上位3バイトに負の数を示すffffffが入ります。
char x=255;
printf("%d\n",x);
だと255でなく、-1が表示されます。

対応としては、
unsingned char buf[5]={0x4e,0x94,0xa0,0x2b,0x78}
;
とするか、
printf("0x%02x\n",buf[i]&0xff);
にするかどちらかですね。

Q複数桁10進数の*桁目だけを抽出したい

タイトルがすべてと言えてしまうのですが、
例えば、int宣言された"4287"(この値は変動します)という数値があったとして、1桁目の"7"だけを別の変数へ引き抜きたいのですが、その場合にはANDによるマスク処理による演算で処理可能なのでしょうか?
また、他に良い方法などありましたら教えていただけますでしょうか?

Aベストアンサー

★10進数ですので AND は使えませんね。
・簡単なサンプルを載せますので読み取って下さい。

サンプル1:
int value = 4287;
int a[ 4 ];

a[0] = (value % 10); value /= 10; // 1桁目を取り出す
a[1] = (value % 10); value /= 10; // 2桁目を取り出す
a[2] = (value % 10); value /= 10; // 3桁目を取り出す
a[3] = (value % 10); value /= 10; // 4桁目を取り出す

サンプル2:
int value = 4287;
int a;

a = (value % 10);
value -= a;

value → 4280
a → 7
になります。

Qファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

Q戻り値で構造体を返すことは可能でしょうか?

perlでは以下のように2つの戻り値が可能ですが、C言語では
それができるのでしょうか?
my (ret1, ret2) = test1();

よくやるのは、引数にポインタを渡して、内容を書き換える手を使っていますが、戻り値を複数返せたら、直感的にわかりやすいかなと思いまして・・・

Aベストアンサー

C言語から遠く離れた者ですが、

>>> よくやるのは、引数にポインタを渡して、内容を書き換える手を使っています

これが常識でしょう。これが直感的に理解できるようにC言語を身に付ける必要があるのではないでしょうか。

Qelse if文の順序を変えることに意味がありますか?

else if文の順序を変えることに意味がありますか?
「スプライトに記述したクリップアクションです。
実行される内容はどうでも良いのですが、
else if文の順序を変えることに意味がありますか?」

×(2)の部分だけが実行されません。
      onClipEvent (enterFrame) {
       if (_root.get_tabaco == false ){
         this.gotoAndPlay(4);
(1)  }else if(_root.get_tabaco ==true){
         this.gotoAndPlay(1);
(2)  }else if(_root.state_tabaco == 2){
         this.gotoAndPlay(5);
    }
}
○全て実行されます。
      onClipEvent (enterFrame) {
       if (_root.get_tabaco == false ){
         this.gotoAndPlay(4);
(2)  }else if(_root.state_tabaco == 2){
         this.gotoAndPlay(5);
(1)  }else if(_root.get_tabaco ==true){
         this.gotoAndPlay(1);
    }
}
「(1)と(2)の順序を変えただけで正しく実行されるようになりました。
しかし、なぜ?上手くいったのか、どこが間違いなのか分かりません。
else ifに順序なんかあるんでしょうか?
こられのスクリプトに違いがありましたら、教えていただけませんか?」

else if文の順序を変えることに意味がありますか?
「スプライトに記述したクリップアクションです。
実行される内容はどうでも良いのですが、
else if文の順序を変えることに意味がありますか?」

×(2)の部分だけが実行されません。
      onClipEvent (enterFrame) {
       if (_root.get_tabaco == false ){
         this.gotoAndPlay(4);
(1)  }else if(_root.get_tabaco ==true){
         this.gotoAndPlay(1);
(2)  }else if(_root.state_tabaco == 2){
     ...続きを読む

Aベストアンサー

if A ~ else if B~ else if C~.... は先頭から順番に評価しますから、とうぜん、順番に意味があります。
また、条件式には書かないことが多いですが、「直前までのifの条件が不成立で、かつ」という 条件が付いてます。
上の例なら
else if B → if !A and B
else if C → if !A and !B and C
です。順番が変われば条件も変わってくることが解ると思います。

それをふまえてこのスクリプトを見ると
A: _root.get_tabaco == false
B: _root.get_tabaco == true
C: _root.state_tabaco == 2
です。
ここで、A,Bに注目すると、通常、 a != false ⇔ a==true です。
つまり、 Aが成り立たなければ、必ずBが成り立ちます。
A→B→Cの順番で評価したら、 AかBかでどちらかが必ず成立つので、Cまで進むことはありません。
A→C→Bの順番で評価したら、 Bを評価する前にCを評価するので、Cの条件での判定ができます。


ついでにいうと、「○全て実行されます。」の方の最後の「else if(_root.get_tabaco ==true)」は条件が成立つことが明かなので、 else だけで十分です。

if A ~ else if B~ else if C~.... は先頭から順番に評価しますから、とうぜん、順番に意味があります。
また、条件式には書かないことが多いですが、「直前までのifの条件が不成立で、かつ」という 条件が付いてます。
上の例なら
else if B → if !A and B
else if C → if !A and !B and C
です。順番が変われば条件も変わってくることが解ると思います。

それをふまえてこのスクリプトを見ると
A: _root.get_tabaco == false
B: _root.get_tabaco == true
C: _root.state_tabaco == 2
です。
ここで、A,Bに...続きを読む

Qセマフォとmutexの違いは?

排他制御としてセマフォとmutexがありますが、
この二つの違いがよくわかりません。
自分で調べてみたところ、
・セマフォ…プロセス間排他制御。複数ロックがかけられる。
・mutex…スレッド間排他制御。ロックは一つだけ。

と言うような違いがあるようなのですが、これだけの差なんでしょうか?
(これだけの差、と言ってる時点で筋違いだったら申し訳ありません)
また、セマフォをスレッド間排他制御に用いたり、
mutexをプロセス間排他制御に用いることは可能なのでしょうか?
可能だとしたら、これらが2種類存在する理由も教えていただきたいです。

Aベストアンサー

> >一般論としては、Mutexは「カウントを1に限定した」特殊化したSemaphoreです。
> とのことですが、これはWin32以外の環境だと
> これ以上の違いはないと言うことでしょうか?

「一般論」と書いた意味を取り落とされているのではないかと思います。

「一般論としては〇〇」なのですから、「Win32以外の環境」も含めて「各論」では「必ずしも〇〇とは限らない」とご理解ください。

なお、ご指摘のとおり、あるリソースを排他的に利用するだけであればMutexを使用するかわりにカウントが1のSemaphoreを使用することができます。(特定の環境での、MutexとSemaphoreの環境依存の動作を除けば、ですが。)

ではなぜ2種類が用意されている(用意されている環境が存在する)のかといえば、リソースの排他的利用は非常によくあることなので、これに特化した機能を用意すればより良いであろう、というシステムデザイナの判断によるものと考えられます。

ここで言う「より良い」は、あるデザイナにとっては「便利性」、また別のデザイナにとっては「消費リソースが少ない」と、これまた考え方はいろいろでしょう。

> >一般論としては、Mutexは「カウントを1に限定した」特殊化したSemaphoreです。
> とのことですが、これはWin32以外の環境だと
> これ以上の違いはないと言うことでしょうか?

「一般論」と書いた意味を取り落とされているのではないかと思います。

「一般論としては〇〇」なのですから、「Win32以外の環境」も含めて「各論」では「必ずしも〇〇とは限らない」とご理解ください。

なお、ご指摘のとおり、あるリソースを排他的に利用するだけであればMutexを使用するかわりにカウントが1のSemaphore...続きを読む

QDWORDの実際の型は何でしょうか

VC++.NETの環境です。
DOWRD dw1 = 1;
int i = 2; と定義し
ここで
if ( i > dw1 ){
何かの処理;
}
とコーディングすると
warning C4018: '>' : signed と unsigned の数値を比較しようとしました。
のワーニングがでます。
これは、DWORDがint型でなくunsigned int型のようにも見えます。
ある本によれば(VC++.V.NET逆引き大全500の極意)
DWORD はint型であると記述されています。
もし、int型ならこのワーニングはでないはずなのですが、
なぜでるのでしょうか。又、DWORDの実際の型は何なのでしょうか。ご存じのかたおりましたら、教えていただけませんでしょうか。

Aベストアンサー

型定義が知りたいのならば、宣言ファイルを見れば疑問を挟む余地もありません。
DWORD型はwindef.hで
"typedef unsigned long DWORD;"
と宣言されています。

Visual Studioを使っているのならば、知りたい型の上にマウスポインタを置いて右クリック、ポップアップメニューの「定義へ移動」または「宣言へ移動」で簡単に知ることが出来ます。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング