免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 14105 | 回复: 87
打印 上一主题 下一主题

C语言里面 1 ? "123" : "1234" 是一个非法的表达式 [复制链接]

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-04-24 17:30 |只看该作者 |倒序浏览
我不是很确定我的结论,下面是我的看法

在C语言里,string literal的类型仍然是字符数组,感觉这一点在C的标注里面6.4.5写得不是很明白,我的理解是string literal的类型是字符数组,不知道对不对。google搜到的结果也说string literal是字符数组。

这一段摘自c99的草案n1124第6.5.15节 conditional operator. 表达式 1 ? "123" : "1234" 不满足第3点提出的限制

2 The first operand shall have scalar type.
3 One of the following shall hold for the second and third operands:
— both operands have arithmetic type; <======== 都是算数类型,不满足
— both operands have the same structure or union type; <======== 都是相同的结构体或者联合体,不满足
— both operands have void type; <===== 都是void类型,不满足
— both operands are pointers to qualified or unqualified versions of compatible types; <=== 都是指针,到底满足还是不满足我不肯定
— one operand is a pointer and the other is a null pointer constant; or <=== 一个是指针,一个是NULL,不满足
— one operand is a pointer to an object or incomplete type and the other is a pointer to a
qualified or unqualified version of void. <==== 一个是指针,一个是void*

欢迎讨论

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
2 [报告]
发表于 2012-04-24 17:35 |只看该作者
都是指针。

论坛徽章:
0
3 [报告]
发表于 2012-04-24 17:35 |只看该作者
楼主是硕士吗?, 3年就好意思开 2万+ ?

论坛徽章:
12
寅虎
日期:2013-12-04 20:37:4915-16赛季CBA联赛之广东
日期:2017-08-22 19:23:1215-16赛季CBA联赛之上海
日期:2016-06-18 23:05:05操作系统版块每日发帖之星
日期:2016-06-06 06:20:00操作系统版块每日发帖之星
日期:2016-06-05 06:20:00操作系统版块每日发帖之星
日期:2016-06-03 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之巴勒斯坦
日期:2015-02-10 21:38:08卯兔
日期:2014-10-31 20:42:23申猴
日期:2014-06-11 17:15:10处女座
日期:2014-05-22 09:00:1815-16赛季CBA联赛之广夏
日期:2017-09-25 23:37:46
4 [报告]
发表于 2012-04-24 17:44 |只看该作者
三月廿七 发表于 2012-04-24 17:35
楼主是硕士吗?, 3年就好意思开 2万+ ?


真正的高手自然可以。

如果是麻省理工出来的,一年开这个数都是混得惨。

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
5 [报告]
发表于 2012-04-24 17:51 |只看该作者
数组在表达式里会变成指针,不知道这个地方怎么算。

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
6 [报告]
发表于 2012-04-24 17:54 |只看该作者
回复 3# 三月廿七


印象中LZ好像是本科。

君不见前些时那个搞后端3年税后15*15想转嵌入式的帖子,看得我泪流满面

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
7 [报告]
发表于 2012-04-24 18:04 |只看该作者
我不是标准帝……  所以:

  1. #include <stdio.h>

  2. int main(int argc, char* argv[])
  3. {
  4.       printf( "%lu %lu\n"
  5.             , (unsigned long)sizeof(char*)
  6.             , (unsigned long)sizeof( argc? "12": "6" ) );
  7.       return 0;
  8. }
复制代码
我只记得C++里三元表达式后两个操作数类型不同会导致exception,而且自己中过招……

论坛徽章:
0
8 [报告]
发表于 2012-04-24 18:10 |只看该作者
马云说:中国有 95%的人高估了自己的能力

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
9 [报告]
发表于 2012-04-24 18:18 |只看该作者
回复 1# koolcoy

或者换一个角度想…… 如上面的

  1. sizeof( argc? "12": "6" )
复制代码
sizeof的结果要求是个常量,(C99有例外,但只是对VLA相关的),而argc不是编译时常量。
如果sizeof( argc? "12": "6" )是 argc? sizeof("12"): sizeof("6"), 就无法成为编译时常量了。

所以,要么sizeof( argc? "12": "6" )非法(但msvc/gcc/clang都支持,即使有pedantic参数);要么它是sizeof( argc? (char*)"12": (char*)"6" )即sizeof(char*)的意思……

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
10 [报告]
发表于 2012-04-24 18:40 |只看该作者
C++里面这是个合法的表达式,我确认。C我不确认,虽然我接触的C编译器都支持这个表达式。

另外,只讨论主题,不讨论签名档,骑驴找马当然对马儿的要求很高 马云觉得别人高估自己,我还觉得马云神话他自己呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP