关于if的问题

fongzl 2008-10-11 10:54:22
if(0)
statement1;
else
{
statement2;
}

这样的语句竟然进不了else,改成下面的就可以进了
if(0)
{
statement1;
}
else
{
statement2;
}


很是奇怪,难道第一种语法有错,msdn上的例子都是这样的阿
if ( i > 0 )
y = x / i;
else
{
x = i;
y = f( x );
}
...全文
51 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
csucdl 2008-10-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jennyvenus 的回复:]
找到一篇文章

在刚开始阅读LINUX的时候有一个小小的宏让我百思不得其解:
#define wait_event(wq,condition) \
do{ \
if(condition) \
break; \
__wait_event(wq,condition); \
}while(0)
这是一个奇怪的循环,它根本就只会运行一次,为什么不去掉外面的do{..}while结构呢?我曾一度在心里把它叫做“怪圈”。原来这也是非常巧妙的技巧。在工程中可能经常会引起麻烦,而上面的定义能够保证这些麻烦不会出现…
[/Quote]

既然这样,那就加上{}就好了嘛。
#define wait_event(wq,condition) \
{ \
if(condition) \
break; \
__wait_event(wq,condition); \
}
用户 昵称 2008-10-11
  • 打赏
  • 举报
回复
找到一篇文章

在刚开始阅读LINUX的时候有一个小小的宏让我百思不得其解:
#define wait_event(wq,condition) \
do{ \
if(condition) \
break; \
__wait_event(wq,condition); \
}while(0)
这是一个奇怪的循环,它根本就只会运行一次,为什么不去掉外面的do{..}while结构呢?我曾一度在心里把它叫做“怪圈”。原来这也是非常巧妙的技巧。在工程中可能经常会引起麻烦,而上面的定义能够保证这些麻烦不会出现。下面是解释:
假设有这样一个宏定义
#define macro(condition) \
if(condition) dosomething();
现在在程序中这样使用这个宏:
if(temp)
macro(i);
else
doanotherthing();
一切看起来很正常,但是仔细想想。这个宏会展开成:
if(temp)
if(condition) dosomething();
else
doanotherthing();
这时的else不是与第一个if语句匹配,而是错误的与第二个if语句进行了匹配,编译通过了,但是运行的结果一定是错误的。
为了避免这个错误,我们使用do{….}while(0) 把它包裹起来,成为一个独立的语法单元,从而不会与上下文发生混淆。同时因为绝大多数的编译器都能够识别do{…}while(0)这种无用的循环并进行优化,所以使用这种方法也不会导致程序的性能降低。
正如微软声称的一样,宏定义与预编译器指令是强大的,但是它又使得程序难以调试。所以在定义宏的时候不要节省你的字符串,一定要力争完整的描述这个宏的功能。同时在定义宏的时候如有必要(比方使用了if语句)就要使用do{…}while(0)将它封闭起来。在宏定义的时候一定要注意各个宏之间的相互依赖关系,尽量避免这种依赖关系的存在。下面就有这样一个例子。
设有一个静态数组组成的整型队列,在定义中使用了这样的方法:
int array[]={5, 6, 7, 8};
我们还需要在程序中遍历这个数组。通常的做法是使用一个宏定义
#define ELE_NUM 4
…………………………..
……………………………..
for(int I=0;I<ELE_NUM;I++)
{
cout<<array[I];
}
由于某种偶然的原因,我们删除了定义中的一个元素,使它变成:
array[]={5,6,7}
而却忘了修改ELE_NUM的值。那么在上面的代码中马上就会发生访问异常,程序崩溃。然后是彻夜不眠的调试,最后发现问题出在这个宏定义上。解决这个问题的方法是不使用
array[]={….}这样的定义,而显式的申明数组的大小:
array[ELE_NUM]={….}
这样在改动数组定义的时候,我们就不会不记得去改宏定义了。总之,就是在使用宏定义的时候能够用宏定义的地方统统都用上。
我发现的另一个有趣的现象是这样的:
假设现在有一个课程管理系统,学生的人数用宏定义为
#define STU_NUM 50
而老师的人数恰好也是50人,于是很多人把所有涉及到老师人数的地方通通用上STU_NUM这个宏。另一个学期过去,学生中的一个被开除了,系统需要改变。怎么办呢?简单的使用#define STU_NUM 49 么?如果是这样,一个老师也就被开除了,我们不得不手工在程序中去找那些STU_NUM宏然后判断它是否是表示学生的数目,如果是,就把它改成49。天哪,这个宏定义制造的麻烦比使用它带来的方便还多。正确的方法应该是为老师的数目另外定义一个宏:
#define TEA_NUM 50
当学生的数目改变以后只要把STU_NUM 定义为49就完成了系统的更改。所以,当程序中的两个量之间没有必然联系的时候一定不要用其中的一个宏去替代另一个,那只会让你的程序根本无法改动。
最后,建议C/C++语言的初学者尽可能多的在你的程序中使用宏定义和预编译指令。多看看MFC,ATL或者LINUX的源代码,你会发现C语言强大的原因所在。
csucdl 2008-10-11
  • 打赏
  • 举报
回复
[Quote=引用楼主 fongzl 的帖子:]
C/C++ codeif(0)
statement1;else{
statement2;
}
这样的语句竟然进不了else,改成下面的就可以进了
C/C++ codeif(0)
{
statement1;
}else{
statement2;
}

很是奇怪,难道第一种语法有错,msdn上的例子都是这样的阿
if ( i > 0 )
y = x / i;
else
{
x = i;
y = f( x );
}

[/Quote]

statement1也没说是简单语句啊
如果是复合语句, 还有可能出错呢, 没有匹配的else, 笨蛋
用户 昵称 2008-10-11
  • 打赏
  • 举报
回复
else 跟最近的那个if匹配

linux下有一种写法是do{ xxxxxxx } while( 0 );,就是习惯上解决这种问题的
用户 昵称 2008-10-11
  • 打赏
  • 举报
回复
statement1
里面肯定有if

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧