奇怪,C or C++ Compiler为何Build不过这句语句???

yuucyf 2009-08-22 10:03:17
语句:
#if (1, 2) != 2
#else
#endif

为什么,一直不清楚为何Build不过???
理由是什么???
难道预编译指令不Support逗号表达式吗?
...全文
122 点赞 收藏 19
写回复
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuucyf 2009-08-22
if ((1, 2) != 2)
{
var++;
}

var = (1, 2) != 2;
while ((1, 2) != 2)
{
}
...都可以通过编译
回复
yuucyf 2009-08-22
(1,2)!=2 是一个表达式吗?

是表达式呀。

if((1,2)!=2)
{
}
可以编译通过。...都可以编译通过,只是在预编译中不能通过编译.
回复
雪影 2009-08-22
楼主为什么会认为#if (1, 2) != 2 能编译通过呢?
一般#if后边是一个宏或一个表达式。

(1,2)!=2 是一个表达式吗?
回复
MoXiaoRab 2009-08-22
(1, 2) != 2 这是啥意思?()是个什么运算符呢?
回复
Jinhao 2009-08-22
[Quote=引用 13 楼 yuucyf 的回复:]
“#if (2)!=2 这个一样会报错,因为内部含有函数,不是常量表达式。”
这个不会报错哦!
[/Quote]

这个当然不会出错

(2) != 2

明显是个常量表达式, 括号只是改变运算优先级。而lz的问题是(1, 2) 这个不是常量表达式,因而
(1, 2) != 2 这整个表达式也不是常量表达式。
回复
MoXiaoRab 2009-08-22
原来lz是学术型的
回复
yuucyf 2009-08-22
我在完成一个类似C Language的Script language,目前QA测试过程中遇到这个问题,事实上大多数User不会这么用,因此也不是非常重要,只不过想知道是什么原因?现在在看标准C中,看看能不能找到答案。
回复
ziplj 2009-08-22
同问
写代码 不是写的让别人看不懂才好
而是写出让一个没学过编程的人都看的了的代码才是好程序员
这种问题 费劲

怀疑楼主是"叫兽" 尽想些外点子整学生
回复
MoXiaoRab 2009-08-22
LZ,你研究这个有意思吗?
回复
雪影 2009-08-22
[Quote=引用 13 楼 yuucyf 的回复:]
“#if (2)!=2 这个一样会报错,因为内部含有函数,不是常量表达式。”
这个不会报错哦!
[/Quote]
确实不会,之前没测试过,不好意思。
估计是如果括号内部只有一个表达式的时候会忽略括号吧。
应该是只有当括号里的表达式超过两个才会被认为无名函数吧。
回复
yuucyf 2009-08-22

“#if (2)!=2 这个一样会报错,因为内部含有函数,不是常量表达式。”
这个不会报错哦!
回复
coderun 2009-08-22
呵呵,编译不通才是硬道理
回复
Jinhao 2009-08-22
[Quote=引用 6 楼 tttyd 的回复:]
而#if后面必须是一个常量表达式。
而(1,2)!=2这个不是一个常量表达式
[/Quote]

关键是(1, 2) 不是常量表达式,因此整个也就不是常量表达式了
回复
Jinhao 2009-08-22
编译不过才正确。

表达式(1, 2) 并不是常量表达式。

#if 后面必须跟的是一个常量表达式。

虽然(1, 2) 里面都是常量,但是这种逗号操作符运算的表达式,C++并不把它看作常量表达式。

判断是不是常量表达式 很简单。case 语句后面必须接一个常量表达式
int i = 2;
switch(i)
{
case (1, 2): //语法错误
break;
}
----
比如,一个整型的常量,如果被常量表达式初始化,那这个常量也是常量表达式
const int a = 0; //文字常量是常量表达式,因此a就是常量表达式,这样a就可以当作编译期常量
const int b = (1, 2); //b并不是常量表达式,不能当作编译期常量
----

回到#if (1, 2) != 2的问题。
这个预编译指令在 GCC 3.4.2能编译通过。所以有些编译器在某些方面对C++语言做了一点扩展。
回复
雪影 2009-08-22
“()”括号里面如果有多个表达式的话,他将被认为是一个函数,一个无名函数,返回值是最后一个表达式
回复
coderun 2009-08-22
问题比较生僻
回复
楼上说的很有意思!
回复
雪影 2009-08-22
你这个问题很有意思
“()”括号里面如果有多个表达式的话,他将被认为是一个函数,一个无名函数,返回值是最好一个表达式
“()”括号内部如果只有一个表达式,他也是一个无名函数,返回值就是这个表达式


而#if后面必须是一个常量表达式
而(1,2)!=2这个不是一个常量表达式,可以认为他是一个无名函数的表达式。无名函数为“()”。
#if (2)!=2 这个一样会报错,因为内部含有函数,不是常量表达式。
#if 2!=2 这将不报错,因为这是一个常量表达式

这个无名函数的功能是返回括号内部“()”的最后一个表达式。
例: (1,2)返回值是2。 (1,2) !=2 相当于 2 !=2.
再说一个例子。
c++中表达式, (1,2,3,4,5.0)返回值是多少? 返回值是 5.0

你可以将“()”看成一个函数,无名函数,返回值为最后一个表达式
回复
沙漠黑鸟 2009-08-22
为什么还真不清楚。 。但有点我想说,楼主你钻研这东西麻子用?
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告
暂无公告