额,那个网站是pipi书屋,看别人介绍网站书挺多的,于是就进去看了一下,注册时看到了很有趣的验证码,都是给C语言程序让写出结果的,不由得让我想起以前微博上流行的复旦大学的微积分验证码。。。想法很新颖嘛,不愧是专门搞计算机类图书的网站。


   看了那注册程序发现挺有趣的,于是列出来看,说不定能学到很多东西。。。

1

#include <stdio.h>
int main()
{
int a = 1;
printf("%d", a << 2 + a);
return 0;
}


<<这个操作符挺少见的,和>>一样都是移位操作符,就是二进制移位,关于移位我转了个文章。

题目不难,1的二进制就是00000001,然后左移2位就是00000100,也就是十进制的8了。(让我想起字符表情←_←和→_→)

话说<<和>>在C++是输出输入符呢。。。


2

#include <stdio.h>
main()
{
printf("%s:%c%d", "pipi", 41, 81);
}



这题考的格式控制符,%s %c %d 分别是字符串,字符和有符号十进制数,41是ASCII码,转换后的字符是),所以最后输出的值是 pipi:)81 ,顺便转载了个关于转义符和格式控制符的文章。

(貌似那个81是随机产生的。。。)



3

#include <stdio.h>
int main()
{
int i=43;
printf("%d\n",printf("%d",printf("%d",i)));
return 0;
}



嗯,这是关于printf返回值的题目,printf返回的是输出的字符数,转义字符算一个字符。这样就题目很容易理解了,答案是4321。


4

#include <stdio.h>
#define ARRAY_SIZE 10
int main()
{
int arr[ARRAY_SIZE] = {51,116,53,120,85,66,71,98,86,100};
int i, j;
for(i = 0; i < ARRAY_SIZE; i++)
for(j = 0; j < ARRAY_SIZE-1; j++)
if(arr[j] > arr[j+1]) {
arr[j] ^= arr[j+1];
arr[j+1] ^= arr[j];
arr[j] ^= arr[j+1];
}
for(i = 0; i < ARRAY_SIZE; i++)
printf("%c", arr[i],arr[i]);
}



作为验证码,这题还真难一眼看出来。。。

好吧是我太弱看不出来,^=这个符号好少见,我查了半天,为什么书里面都没有讲到异或运算符^。。。

a^b,以二进制一位一位对着看,如果相同就取0,如果不同就取a的反(大概是这样),然后再换成十进制,而且

a=a^b;b=b^a;a=a^b;

这句能交换两值,不使用临时变量,灰常神奇。

总之这题就是简单的排序而已,从小到大排序再输出对应的字符:35BGUVbdtx。



5

#include <stdio.h>
int n[]={0x48, 0x65,0x6C,0x6C,
0x6F,0x2C,0x20,
0x77,0x6F,0x72,
0x6C,0x64,0x21,
0x0A,0x00},*m=n;
main(n){
if(putchar (*m)!='\0') main(m++);
}


好吧,递归用在main函数上可以吗,反正我的VC是出错了。。。

题目意思很容易懂,就是输出那些十六进制对应的字符。把n改成int *n调试成功,答案为:Hello, world!



6

#include <stdio.h>
int main() {
int x;
printf("%d",x == (1 && x));
}



这个很容易理解,但这有些问题。

先计算1 && x,当x为1时返回值为1,然后输出1,如果x为其他数返回值也为1,最后输出为0。

而x为多少得看编译器把未初始化的x定义为多少,不同编译器不同结果。

但正常编译器都不会定义为1的,所以答案为0。



7

#!/usr/bin/env python
import math
print int(math.pow(2, 69))



python语言我也没学过啊,上传到​​http://codepad.org/​​​上跑了一下就出来了,据百度知道上说是求2的69次方。。。

答案为:590295810358705651712



8

// javascript
function show(a){
alert(2 < a < 3);
}
show(1);



javascript。。。还是没学过,有空得学学。。。

度娘说

1. 首先计算2<1,结果为false,

2. 然后计算 false<3;

3. js自动转换数据类型以做比较,false就是0

4. 0<3的结果自然是true

答案为true



嗯,题目就差不多了,如果以后再刷新出新题目再拿来分享吧。。。

这次也学到了挺多(^_^)(这不是异或号哦)。。。