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

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

为什么,一直不清楚为何Build不过???
理由是什么???
难道预编译指令不Support逗号表达式吗?
...全文
158 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
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
  • 打赏
  • 举报
回复
为什么还真不清楚。 。但有点我想说,楼主你钻研这东西麻子用?

16,548

社区成员

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

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

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