【超神奇的~~~】for循环在条件语句中遍历字符串常量 的疑问贴

董小尾 2011-02-15 11:07:50
偶然间看到的一篇文章,原文如下

for循环在条件语句中遍历字符串常量
这样利用字符串常量的方法我还是第一次见到,有点意思吧。最初的程序源自这里,那个程序中不同的字符表示putchar循环执行的次数不同,下标奇偶决定了打印!还是空格。可以根据这样的方法构造一个打印几种字符组成的像素图形。

#include <cstdio>
int main()
{
int a,b,c;
for (c=b=10;a="VAMSI PERI,TFy!QJu ROo TNn(ROo)SLq SLq ULo+ UHs UJq TNn*RPn/QPbEWS_JSWQAIJO^ NBELPeHBFHT}TnALVlBLOFAkHFOuFETp HCStHAUFAgcEAelclcn^r^r\\tZvYxXy T|S~Pn SPm SOn TNn ULo0ULo#ULo-W Hq!WFs XDt!" [b++];)
for(; a-- > 64 ; )
putchar ( ++c==90 ? c=10:33^b&1);
}

照着这样的方法写了个打印字符串的东西,可以按照指定长度换行。

#include <cstdio>
int main()
{
int a,b,c;
for (c=b=0;a="www.cppblog.com/gohan this is a test"[b++];)
if(a!='\0')
putchar ( ++c==30 ? c=0,b--,10:a);
putchar(10);
}

最后这个是打印一个自己构造的ASC字符,这里构造的是我的名字

#include <cstdio>
int main()
{
int a,b,c;
for (c=0,b=0;a="@u@GFLB[@DBJDDFEDEFD@CBBDBBDBBBDBBBCBCBDBC@BBDBBBDBBBDBBBCBCBDBD@CFDDDBDBDGABDBE@v"[b++];)
for(; a-- > 64 ; )
putchar ( ++c==54 ? c=0,10:33^b&1);
}









对于其中的奥义不得其解,在vc6.0中未能成功运行,还望路过的高手指点一二。

一、for (c=0,b=0;a="@u@GFLB[@DBJDDFEDEFD@CBBDBBDBBBDBBBCBCBDBC@BBDBBBDBBBDBBBCBCBDBD@CFDDDBDBDGABDBE@v"[b++];)

二、 putchar ( ++c==54 ? c=0,10:33^b&1);


这些是什么语法呢,我学的还比较浅,不能很好的理解。

另外这个图形是怎么打印出来的呢,感觉很神奇


原文地址:http://www.cppblog.com/gohan/archive/2008/06/30/54941.aspx

...全文
335 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
管哥的天下 2011-02-17
  • 打赏
  • 举报
回复
http://writeblog.csdn.net/PostList.aspx
董小尾 2011-02-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zhao4zhong1 的回复:]
参考SigZag软件
[/Quote]


谢谢你的提议
guoxiaojuan1984 2011-02-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 shikn 的回复:]
引用 2 楼 qustdong 的回复:
但是

putchar ( ++c==30 ? c=0,b--,10:a);

putchar ( ++c==54 ? c=0,10:33^b&1);



1.
下面根据表达式优先级加括号
putchar ( (++c==30 )? (c=0,b--,10):(a));
int c 用来换行计数用的, c每次++,……
[/Quote]很清晰,学习了。
董小尾 2011-02-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 shikn 的回复:]
引用 2 楼 qustdong 的回复:
但是

putchar ( ++c==30 ? c=0,b--,10:a);

putchar ( ++c==54 ? c=0,10:33^b&1);



1.
下面根据表达式优先级加括号
putchar ( (++c==30 )? (c=0,b--,10):(a));
int c 用来换行计数用的, c每次++,……
[/Quote]

恩 很详细,谢啦
董小尾 2011-02-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yui 的回复:]
引用 2 楼 qustdong 的回复:

引用 1 楼 thefirstz 的回复:
字符串代表一个地址,后面接[b++],其实就是相当于
char *p = "xxx";
p[b++];

如果对于数组和指针内容的存取,最后都转换为地址,举个例子:

C/C++ code
char ch[] = "abc";
printf("%c\n",ch[1]);
//这里存取第二……
[/Quote]

哈哈 你也很厉害的
赵4老师 2011-02-16
  • 打赏
  • 举报
回复
参考SigZag软件
shikn 2011-02-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 qustdong 的回复:]
但是

putchar ( ++c==30 ? c=0,b--,10:a);

putchar ( ++c==54 ? c=0,10:33^b&1);

[/Quote]

1.
下面根据表达式优先级加括号
putchar ( (++c==30 )? (c=0,b--,10):(a));
int c 用来换行计数用的, c每次++, 如果等于30了,就是到第30列了, 执行(c=0,b--,10),逗号表达式,由左向右,把c清零,b--,就是这次这个字符不打印,留到下一行打印, 打印 (char)10,就是ascii码NL,换行符。否则输出a,就是就是那个字符串 for (c=b=0;a="www.cppblog.com/gohan this is a test"[b++];) 中的字符。

2.
putchar ( (++c==54) ? (c=0,10):(33^(b&1)));

同理,c等于54列后,c清零,换行,否则,计算b&1的结果,b是奇数返回1,b是偶数返回0; 1异或33,是32,0异或33 还是33; 33 的ascii码是!, 32是空格;
也就是b是奇数输出空格,b是偶数输出!


yui 2011-02-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 qustdong 的回复:]

引用 1 楼 thefirstz 的回复:
字符串代表一个地址,后面接[b++],其实就是相当于
char *p = "xxx";
p[b++];

如果对于数组和指针内容的存取,最后都转换为地址,举个例子:

C/C++ code
char ch[] = "abc";
printf("%c\n",ch[1]);
//这里存取第二个字符,其实和下面把下面写在外面是一样的,因为……
[/Quote]

差不多的东西,稍加注释了下,希望能有帮助

http://blog.csdn.net/yui/archive/2011/02/16/6188164.aspx
董小尾 2011-02-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 thefirstz 的回复:]
字符串代表一个地址,后面接[b++],其实就是相当于
char *p = "xxx";
p[b++];

如果对于数组和指针内容的存取,最后都转换为地址,举个例子:

C/C++ code
char ch[] = "abc";
printf("%c\n",ch[1]);
//这里存取第二个字符,其实和下面把下面写在外面是一样的,因为最后都是取ch+1地址上……
[/Quote]

恩 谢谢啦,这个算是明白了。

但是

putchar ( ++c==30 ? c=0,b--,10:a);

putchar ( ++c==54 ? c=0,10:33^b&1);


这样的语句,vc6貌似不认可。

另外如何处理才能随心所欲的实现上图的效果呢?
昵称很不好取 2011-02-15
  • 打赏
  • 举报
回复
字符串代表一个地址,后面接[b++],其实就是相当于
char *p = "xxx";
p[b++];

如果对于数组和指针内容的存取,最后都转换为地址,举个例子:
    char ch[] = "abc";
printf("%c\n",ch[1]);
//这里存取第二个字符,其实和下面把下面写在外面是一样的,因为最后都是取ch+1地址上的东西
printf("%c\n",1[ch]);

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧