对第一段代码的解释:
/*
其实_是参数个数,对于直接运行的程序来说,表示只有第一个参数,即可执行文件路径,因此它就为1.
注意:
a[b] 即*(a+b), 即*(b+a),即b[a];
a[i]是*(a+i),因此a[i]也可以写为i[a];(一个常数+一个指针,结果还是一个指针)
_++["J!Mpwf!Zpv\24\1"]-1);
把_换成i
i++["J!Mpwf!Zpv\24\1"]-1);
也就是
("J!Mpwf!Zpv\24\1")[i++] -1
因此每个字符是要打印输出字符的后一个字符,例如要打出I,输入的是I后面的J。打印空格,输入的是后面的'!'。
\24表示输入的是8进制数,即十进制的20。19打出来是两个连续叹号(注意,是一个特殊字符,不同于 '!').
-------------------------------------------------
常用的转义字符及其含义
-------------------------------------------------
转义字符 转义字符的意义
\n 回车换行
\t 横向跳到下一制表位置
\v 竖向跳格
\b 退格
\r 回车
\f 走纸换页
\\ 反斜线符"\"
\' 单引号符
\a 鸣铃
\ddd 1~3位八进制数所代表的字符
\xhh 1~2位十六进制数所代表的字符
广义地讲,C语言字符集中的任何一个字符均可用转义字符来表示。表2.2中的\ddd和\xhh正是为此而提出的。
ddd和hh分别为八进制和十六进制的ASCII代码。如\101表示字?quot;A" ,\102表示字母"B",\134表示反斜线,
\XOA表示换行等。
int putchar(int c);向stdout写入一个字符,即打印一个字符。返回值是被写入的字符。所以上面的输入参数最后一个字符必须是\1,这样才能结束循环。
int main( int argc[ , char *argv[ ] [, char *envp[ ] ] ] );
这里的第一个参数,argc总是大于等于1。argv是中存储了命令行参数的字符串数组,最后一个总是NULL。
命令行来源于文件拖放,运行或cmd下输入的命令行等。
当从应用程序直接启动时(例如双击),一般argc=1,argv[0]是程序文件的路径。但是不要用argv参数来获取程序路径,因为如果用户使用CreateProcess函数启动一个进程,则argv参数由CreateProcess参数指定,所以可能不准确。
在上面的代码中,main函数只提供第一个参数,直接启动程序时,其值为1.
*/