c++ 中 if条件句为什么不能先初始化一个变量再判断?

#include <iostream>
using namespace std;
int main()
{
int x=3;
if((int y=x)!=4)
cout<<y<<endl;
return 0;
}

if条件句为什么不能先初始化一个变量再判断?

#include <iostream>
using namespace std;
int main()
{
int x=3;
if(int y=x)
cout<<y<<endl;
return 0;
}
首先,上面是能通过编译的,说明,不是因为你在if里面用了声明语句,而是(int y=x)!=4 这句话本身有问题,你不能同时声明一个变量然后去比较,而且这样比较也没有什么意思,既然你都赋值了,那就直接用等式后面的去比较不就行了吗?追问

我只是想把x赋给y,然后再确定y是不是等于4,
如果按你的说法就改变了我的原意了。

追答

1303: if ( int b = 3 )
00DE276E mov dword ptr [b],3 // 将3赋值给b
00DE2775 cmp dword ptr [b],0 // 将b与0进行比较
00DE2779 je main+5Bh (0DE27ABh)
1304: {
上面是一段反汇编的代码,个人感觉(int b = 3) != 4 这样也能说通,但是这个不能通过编译,也就是语法上强制要求,有可能是 != 符号的问题,如果是先
int b;

(b = 3) != 4; 这句是能通过的,也就是说,!= 的左右是可以有赋值语句的(这个估计大家也用得不少了),但是 int b = 3;这是一个声明语句,而声明的同时给赋予了初始值而已,但始终还是一个声明语句,换个角度想,如果声明语句可以作为 != 的左右值,那么就有可能会出现(int b) != 4; 或者 4 != (int b);而这样的情况,估计就很诡异了吧。

上面就是我自己的一些猜测和想法,没有任何书面依据,希望知情人士可以指点。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-09-17
int y=x; //这样是表示声明一个变量,并赋值;
你把声明并赋值语句放在了 if 判断条件里面了,所以就报错了;
要想在 if 里面判断变量,要提前声明变量
第2个回答  2013-09-17
不是不能初始化在判断,而是不能有变量的声明,这跟编译器有关系
你可以初始化再判断,只能这样用
int y;
if((y=x)!=4)...追问

你是说判断里的是声明?

追答

int y就是变量声明

追问

这种写法也挺好的,为什么编译器要屏蔽掉呢,有没有解释这个的出处?

追答

怎么好了?
有什么意义吗?
能增强可读性吗?
既然不能添加这种无意义的编译解析干嘛?就跟现在人再造字似得!

追问

最新回复的yeswd_skyping
他提到的你可以看一看

追答

对,我说的是不太对

第3个回答  2013-09-17

因为声明/定义是语句不是表达式,所以不能作为表达式的一部分,没记错的话C++是允许

if(int y=x)

这样在if的条件中初始化的语法的,这是C++允许随处初始化的一个看似奇葩的例子……

第4个回答  2013-09-17
void Screen()
{int i;
settextstyle(0, 0, 2);
outtextxy(50,50,"BLACK WHITE CHESS");
settextstyle(0,0,1);
outtextxy(4,354,"ESC -->OVER!!");
outtextxy(4,364,"A -->Try Again!!");
setcolor(1);
rectangle(100,100,300,300);
rectangle(1,350,170,450);
for(i=1;i<21;i++)
{line(100+10*i,100,100+10*i,300);
line(100,100+10*i,300,100+10*i);
}
}
void PicBlock(int x,int y)
{if(Change==1) setcolor(RED);
else setcolor(YELLOW);
line(x+1,y+1,x+1,y+3);line(x+9,y+1,x+9,y+3);
line(x+1,y+9,x+1,y+7);line(x+9,y+9,x+9,y+7);
line(x+1,y+1,x+3,y+1);line(x+1,y+9,x+3,y+9);
line(x+9,y+1,x+7,y+1);line(x+9,y+9,x+7,y+9);
}
void CoverBlock(int x,int y)
{setcolor(BLACK);
line(x+1,y+1,x+1,y+3);line(x+9,y+1,x+9,y+3);
line(x+1,y+9,x+1,y+7);line(x+9,y+9,x+9,y+7);
line(x+1,y+1,x+3,y+1);line(x+1,y+9,x+3,y+9);
line(x+9,y+1,x+7,y+1);line(x+9,y+9,x+7,y+9);
}
相似回答