Chinaunix

标题: case的分段匹配(我找了很久了) [打印本页]

作者: woshi410    时间: 2004-10-21 17:57
标题: case的分段匹配(我找了很久了)
C++ primer上也看过了,没有   

我想用switch..case
switch( nNum )
{
  case 1 .... 15:
  break;
  case 48 .... 90:
  break;
  default:
...
}

该怎么实现.用case

以前在那里看见过,现在忘了,好像要用省略号的.


谢了
作者: daniel-hou    时间: 2004-10-21 19:32
标题: case的分段匹配(我找了很久了)
我不清楚,但可以加个判断,就好像影射一样.
作者: aspbiz    时间: 2004-10-21 20:17
标题: case的分段匹配(我找了很久了)
1 .. 3:

Gcc的扩展。
作者: aspbiz    时间: 2004-10-21 22:35
标题: case的分段匹配(我找了很久了)
GCC扩展:

long long var;    //64bit

_attribute_  (())


switch (var)
{
case 0 ... 2:

break;

case 3 ... 5:

break;

default:
}

是三点,且前后有空格。
作者: aero    时间: 2004-10-22 08:39
标题: case的分段匹配(我找了很久了)
原帖由 "aspbiz" 发表:
GCC扩展:



_attribute_  (())


^_^,学到了,谢谢了。这个attribute是做什么用的呢?
作者: zealotcat    时间: 2004-10-22 09:11
标题: case的分段匹配(我找了很久了)
_attribute_ (()) 是个什么东西?
作者: aero    时间: 2004-10-22 10:04
标题: case的分段匹配(我找了很久了)
gcc还支持不指定大小的数组定义。好像以前听说过这个是C语言的99标准啊?不清楚到底是什么,反正VC中是不好用。

  1. #include <stdio.h>;
  2. #include <stdlib.h>;

  3. void fun(int n);

  4. int main(void) {
  5.         int     n;
  6.         n = 5;
  7.         fun(n);
  8.         exit(0);
  9. }

  10. void fun(int n) {
  11.         char    a[n];

  12.         a[n-1] = 'a';
  13.         printf("%c\n", a[n-1]);
  14.         exit(0);
  15. }
复制代码

作者: woshi410    时间: 2004-10-22 10:18
标题: case的分段匹配(我找了很久了)
原帖由 "aspbiz" 发表:
GCC扩展:

long long var;    //64bit

_attribute_  (())


switch (var)
{
case 0 ... 2:

break;

case 3 ... 5:

break;

default:
}

是三点,且前后有空格。


大哥,在Visual C++下可以不,好像不行         
作者: aero    时间: 2004-10-22 10:21
标题: case的分段匹配(我找了很久了)
原帖由 "woshi410" 发表:


大哥,在Visual C++下可以不,好像不行         


大哥,说了是gcc的扩展了。
作者: woshi410    时间: 2004-10-22 11:11
标题: case的分段匹配(我找了很久了)
gcc 下可以,
gcc --v 3.3.2
作者: woshi410    时间: 2004-10-22 11:17
标题: case的分段匹配(我找了很久了)

  1. #include <stdio.h>;

  2. int main( int argc, char * argv[] )
  3. {
  4.         if( argc < 2 )
  5.                 return 0;

  6.         long long var = atoi( argv[1] );
  7.         switch( var ){
  8.         case 1 ... 15:
  9.                 printf("1...15\n");
  10.                 break;
  11.         case 16 ... 32:
  12.                 printf("16...32\n");
  13.                 break;
  14.         default:
  15.                 printf("Null\n");
  16.         }

  17.         return 1;
  18. }
复制代码



soldev@ws2 1\>;gcc -v
Reading specs from /usr/local/lib/gcc-lib/i386-pc-solaris2.9/3.3.2/specs
Configured with: ../configure --with-as=/usr/ccs/bin/as --with-ld=/usr/ccs/bin/l
d --disable-nls --disable-libgcj --enable-languages=c,c++
Thread model: posix
gcc version 3.3.2

soldev@ws2 8\>;uname -a
SunOS qqtws2 5.9 Generic_112234-03 i86pc i386 i86pc

soldev@ws2 19\>;testcase 11
1...15

soldev@ws2 20\>;testcase 24
16...32

soldev@ws2 21\>;testcase -1
Null

完毕..........           
作者: jourmen    时间: 2004-10-22 11:25
标题: case的分段匹配(我找了很久了)
case区间,c99标准提供
找个支持c99的编译器
作者: aero    时间: 2004-10-22 11:34
标题: case的分段匹配(我找了很久了)
jourmen ,^_^,见到你真高兴。

上面的那些特性。是C99标准提供的,还是gcc编译器的扩展呢?
如果是标准就好了。^_^。

另外,那些标准从哪里可以搞到啊?
作者: hhygcy    时间: 2004-10-22 11:36
标题: case的分段匹配(我找了很久了)
大家的回答真好啊 真是感谢大家
作者: jourmen    时间: 2004-10-22 12:33
标题: case的分段匹配(我找了很久了)
原帖由 "aero" 发表:
jourmen ,^_^,见到你真高兴。

上面的那些特性。是C99标准提供的,还是gcc编译器的扩展呢?
如果是标准就好了。^_^。

另外,那些标准从哪里可以搞到啊?


是c99的标准,gcc还没有完全支持c99!
你可以google "c99 standard"
http://home.tiscalinet.ch/t_wolf/tw/c/c9x_changes.html
http://www.softintegration.com/demos/chstandard/c99.html
http://www.schellong.de/better_c99.htm
贴给你几个!你在找找!

有关case区间的!在那看过,一下子想不起来了!我在找找!
作者: aero    时间: 2004-10-22 12:38
标题: case的分段匹配(我找了很久了)
呵呵,中午搜了点C99的资料来看。扩展了很多新特性。不过很多编译器还不支持,支持的解释也还不太一样。看来还是要谨慎使用C99的新特性。^_^。写程序的,如果想bug少,还是保守点好。

哈哈,十分感谢你啊,jourmen。
现在还不明白的就是attribute的那个东西是什么意思?怎么使用呢?
作者: woshi410    时间: 2004-10-22 13:49
标题: case的分段匹配(我找了很久了)
原帖由 "jourmen" 发表:


是c99的标准,gcc还没有完全支持c99!
你可以google "c99 standard"
http://home.tiscalinet.ch/t_wolf/tw/c/c9x_changes.html
http://www.softintegration.com/demos/chstandard/c99.html
http://www.schellon..........


谢谢你,大哥.

btw:Visual studio.net 7.0和7.1的对C++ standard支持有具体详细文档么.
哪位知道?
作者: jourmen    时间: 2004-10-22 14:01
标题: case的分段匹配(我找了很久了)
更正, 更正
差点害人了!

case区间用法是gnu gcc的扩展, 不是c99的标准!道歉,不好意思,记错了!
作者: aspbiz    时间: 2004-10-22 14:27
标题: case的分段匹配(我找了很久了)
楼上的都是大哥,

我也是刚好看书看到这些

_FUNCTION_ 也是GCC的扩展,输出当前函数名。

attribute我也不是很清楚,

知道一些,比如:
int i ; _attribute_ ((unuse))

表示,如果变量i未使用,GCC不报错。
作者: aero    时间: 2004-10-22 14:37
标题: case的分段匹配(我找了很久了)
你用的gcc是什么版本的啊?偶这里的gcc不支持attribute这个。
作者: aspbiz    时间: 2004-10-22 14:44
标题: case的分段匹配(我找了很久了)
我没试,只是看书,

晚上回家试了再说吧。
作者: icestare    时间: 2004-10-22 15:55
标题: case的分段匹配(我找了很久了)
记得_attribute_ (())可以用在内存对齐上。。。。。。。
环境:rh9.0 默认gcc编译器。
gcc version 3.2.2 20030222 (Red Hat Linux 3.2.2-5)


  1. struct test {
  2.         int i;
  3.         char a[1];
  4. }__attribute__((aligned(16)));/*参数为2的n次方*/

  5. main()
  6. {
  7.         printf("sizeof(test):%d\n",sizeof(struct test));
  8. }
复制代码

打印出来应该是16字节,如果结构中没有“__attribute__((aligned(16))) ”
那么打印出来应该是默认的8字节---编译器默认由int型4(sizeof(int))字节对齐。


  1. struct test {
  2.         char a[1];
  3. };

  4. main()
  5. {
  6.         printf("sizeof(test):%d\n",sizeof(struct test));
  7. }
复制代码

结果为 1(sizeof(char))。
作者: aero    时间: 2004-10-22 16:27
标题: case的分段匹配(我找了很久了)
那这个东西的功能不是和#pragma pack()一样了吗?带着这样的疑问,我做了几个实验,结果很有趣。
我的机器是32位的,所以默认的是4字节对齐。
用#pragma pack()的时候,可以改成1字节对齐,2字节对齐,或者默认的4字节对齐。但是不能改成8、16、32字节对齐。
而用attribute这个确可以改成8、16、32、甚至64,但是就不能改成1、2对齐了。
真是奇怪。
作者: gvim    时间: 2004-10-22 20:59
标题: case的分段匹配(我找了很久了)
attribute有n多的属性,man gcc里面有,以前读大学的时候还专门翻译了记载本本上,结果,毕业的时候全部换成路费了。^^
作者: ge126    时间: 2004-10-22 22:26
标题: case的分段匹配(我找了很久了)
VC不支持的,这个是GCC的扩展,
你可以在windows下面使用GCC来编译嘛,呵呵
作者: woshi410    时间: 2004-10-23 10:56
标题: case的分段匹配(我找了很久了)
没办法,visual stuido下用的是if else搞的.

解决方案:
if()
else if()
else if()
else if()
else if()
else if()
else if()
else if()
else if()
else if()
else if()
else if()
else


累死我了,
作者: THEBEST    时间: 2004-10-23 12:52
标题: case的分段匹配(我找了很久了)
直接:
case 1: case 2: case 3: case 4:...
case 5: case 6: case 7: 嘛...这样不标准的东西没移植性的东西能偷懒的吗?
作者: sega6666    时间: 2004-10-23 14:50
标题: case的分段匹配(我找了很久了)
原帖由 "woshi410" 发表:
没办法,visual stuido下用的是if else搞的.

解决方案:
if()
else if()
else if()
else if()
else if()
else if()
else if()
else if()
else if()
else if()
else if()
else if()
else


累死我了..........


恩,够辛苦!VC苦
作者: THEBEST    时间: 2004-10-23 18:06
标题: case的分段匹配(我找了很久了)
不可移植的扩展功能有何用?




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2