免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: _google
打印 上一主题 下一主题

[C] HELP!我是C新手,看到两个oracle的C语言面试题 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2007-01-11 10:54 |只看该作者
a ^= b ^= c ^= a ^= b ^= c ^= a ^= b;       
这个没问题,牛X
a = a 0 ^ b0;
c = c0 ^ a0 ^b0;
b = b 0 ^ c ----- b0 ^ c0 ^ a0 ^ b0 ---- c0  ^ a0
a = a ^ b ---- a0 ^ b0 ^ c0 ^ a0 ---- b0 ^ c0
c = c ^ a ---- c0 ^ a0 ^ b0 ^ b0 ^ c0 ---- a0
b = b ^ c ---- c0 ^ a0 ^ a0 ---- c0
a = a ^ b ---- b0 ^ c0 ^ c0 ---- b0
所以结果就是c = a0; b = c0; c = a0;
没有问题;

论坛徽章:
0
32 [报告]
发表于 2007-01-11 11:22 |只看该作者
原帖由 wyaccent 于 2007-1-9 22:30 发表
c = (a+c)-(a=b,b=c);
ISO/IEC 9899:1999 6.5.3
Except as specified later (for the function-call (), &&, ||, ?:, and comma operators), the order of evaluation of subexpressions and the order in which side effects take place are both unspecified.

[ 本帖最后由 tyc611 于 2007-1-11 11:24 编辑 ]

论坛徽章:
0
33 [报告]
发表于 2007-01-11 11:23 |只看该作者
int c_atoi(char *s, int *err)
{
        int i, sum=0;
        for ( i= s!=NULL? s[0]=='-' ? 1 : 0 : 0; (s!=NULL) && (s>='0') && (s<='9'); i++)
                sum = sum*10 + s - '0';      
        return (s!=NULL)&&(s=='\0') ? (*err=0, s[0]=='-'? -sum : sum) : (*err=-1,s[0]=='-'? -sum : sum);
}

[ 本帖最后由 icytear 于 2007-1-11 17:14 编辑 ]

论坛徽章:
0
34 [报告]
发表于 2007-01-11 11:30 |只看该作者
对于第一个问题作个规律性的总结,n个数的交换
n1,n2,n3,......,nn
计算地步骤:
n1=n1+n2+....+nn

nn=n1-n2-...-nn
...
...
n2=n1-n2-...-nn
n1=n1-n2-...-nn
也就是先计算最后一个值,然后是前面的,其实等式的右边都是一样的

论坛徽章:
0
35 [报告]
发表于 2007-01-11 12:14 |只看该作者
原帖由 yi_3 于 2007-1-11 10:45 发表
c = (a+c)-(a=b,b=c);
这个是错误的,大部分编译器都会解释成:
b=c;
a=b;

c=(a+c)-a;
显然错误了, 结果b=c0; a= b0; c=b0

应该是先a=b,再b=c,至于operator - 两边的操作数的计算次序是未指定的。

论坛徽章:
0
36 [报告]
发表于 2007-01-11 14:35 |只看该作者
逗号表达式的顺序问题

论坛徽章:
0
37 [报告]
发表于 2007-01-11 14:45 |只看该作者

  1. void swap(int& a, int& b){
  2.         a = a + b;
  3.         b = a - b;
  4.         a = a - b;
  5. }

  6. swap(a,b);
  7. swap(b,c);

复制代码


这样子就好了阿  很简单的

[ 本帖最后由 DraculaW 于 2007-1-12 13:51 编辑 ]

论坛徽章:
0
38 [报告]
发表于 2007-01-12 10:07 |只看该作者
oracle怎么出这种题?要搞研发的人?

论坛徽章:
0
39 [报告]
发表于 2007-01-12 12:07 |只看该作者
原帖由 tyc611 于 2007-1-11 12:14 发表

应该是先a=b,再b=c,至于operator - 两边的操作数的计算次序是未指定的。


恩,是,确实是和编译器相关的:
从VC6编译出的代码来看:
应该是:
a=b;
(a+c);
b=c;
(a+c) - b;
c = (a + c) - b
所以最后结果是:
a = b0; b = c0; c = (b0 + c0) - c0 = b0;

我估计gcc编译出来的可能不太一样 :)
所以这样的表达式如果相互应用变量的话,副作用很大 :)

论坛徽章:
0
40 [报告]
发表于 2007-01-12 16:12 |只看该作者
第一题已经有了很好的答案,记得以前有个算法用位来的一位一位的换
第二题还没有五句应该算答案

  1. long strtol(const char *ptr)
  2. {
  3.     long len,res,val=1;
  4.     for(len=strlen(ptr);len--&&ptr[len]>='0'&&ptr[len]<='9';val*=10)
  5.          res+=val*(ptr[len]-'0');
  6.     return (len>0)?(-1):(res);
  7. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP