LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: YSM

在Linuc C下有没有把整个字符串(仅为字母)转换成小写字母或大写字母的吗?

[复制链接]
发表于 2003-9-29 15:54:44 | 显示全部楼层
我这里可以啊
你使用的是什么编译器

我使用的是VC
发表于 2003-9-29 16:53:28 | 显示全部楼层
RH9.0    GCC3.2.2  死活就是不通过,晕啊
发表于 2003-9-29 17:05:57 | 显示全部楼层
请看如下测试代码(RH9.0,GCC3.2.2):
  1. #include <stdio.h>

  2. int main()
  3. {
  4.     int i=3;
  5.     if (i++ != i)  puts("i++ != i");
  6.     if (++i != i)  puts("++i != i");
  7.     if (i != i++)  puts("i != i++");
  8.     if (i != ++i)  puts("i != ++i");
  9.     if (i++ != i++) puts("i++ != i++");
  10.     if (++i != ++i) puts("++i != ++i");
  11. }
复制代码


显示结果如下:
[root@localhost test]# ./test3
i++ != i
i != i++
i++ != i++

我明白了一个成语——“百思而不得其解”
发表于 2003-9-29 17:52:08 | 显示全部楼层
晕了,真晕了,对于上面,*p=*++p,然后字符串变成abceefg,那么就应该i!=++i为真,然而由上面帖子代码结果可知 i == ++i为真。这一片真晕人,又写了个代码:
if ((j=i++)!=(k=i++)) {puts("i++ != i++");}
printf("i=%d  j=%d  k=%d\n",i,j,k);
显示结果为i=13,j=11,k=11。
干别的了先......
发表于 2003-9-29 19:43:59 | 显示全部楼层
这个确实有点怪,别的编译器我还没试过,用gcc -S xxx.c看一下汇编程序就比较清楚了

"i++"一般是:

  1. leal  -4(%ebp), %eax  //变量地址进eax
  2. incl  (%eax)          //增加内存中的值
复制代码

"=="一般是:
cmpl  %edx, -4(%ebp)
用一个寄存器和一个内存中的值比较

在+的时候没问题,
象x = i++ + i++;

  1. movl  -4(%ebp), %edx
  2. movl  -4(%ebp), %eax     //两个i进寄存器edx,eax
  3. leal  (%eax,%edx), %eax  //相加
  4. movl  %eax, -8(%ebp)     //相加的结果赋值给x
  5. leal  -4(%ebp), %eax
  6. incl  (%eax)             //i++
  7. leal  -4(%ebp), %eax
  8. incl  (%eax)             //i++
复制代码

gcc是先赋值后++,得到的值是i + i

但是比较的时候就有点问题,x = i == i++;

  1. movl  -4(%ebp), %edx  //i进edx
  2. leal  -4(%ebp), %eax
  3. incl  (%eax)          //i++
  4. cmpl  %edx, -4(%ebp)  //比较(==)
  5. sete  %al
  6. movzbl  %al, %eax
  7. movl  %eax, -8(%ebp)  //赋值给x
复制代码

gcc是先++后比较,如果两边的变量不同就没问题,比如x = i++ == j++; gcc会把i和j先放到ecx和edx里,再用eax对内存中的值进行++,但是两边的变量相同就有问题。
总之,当i++出现在表达式中的时候,gcc一般是用一个寄存器保存i的当前值,用eax增加内存中的值,这都没什么问题,问题主要出现在比较的时候用寄存器中保存的值和内存中的值比较,而且incl (%eax)又在cmpl前面。

我昨天试了好多种情况,一般都没什么问题,赋值、函数调用都好着呢,就是当++和比较运算符一起的时候比较晕。我现在还不知道为什么这样。
发表于 2003-9-29 19:56:52 | 显示全部楼层
x= i == i++
这是两个语句了
虽然可以写在一起

不同的编译器处理方法不一样对上面这句
我有时间时到gh下看看吧
发表于 2003-9-29 20:00:06 | 显示全部楼层
实际上在x = i++ == j++;里也是如此,gcc把i和j先放到ecx和edx里,再用eax对内存中的值进行++,两个++完了以后才cmpl,不过这里就没什么问题,我还不清楚为什么要把incl放在cmpl前面,象+的时候就没有这样,是先+后++的。
发表于 2003-9-29 20:04:22 | 显示全部楼层
呵呵,我实验的时候是这么写的,就照抄上来了,其实用i == i++或i++ == j++也是一样的。
发表于 2003-9-29 20:17:33 | 显示全部楼层
据我观察,能不这样写,最好不这样写。
发表于 2003-9-29 20:42:06 | 显示全部楼层
:p pascal 就有這個好處
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表