求一些C的非常规用法,大家吧自己知道的都说出来一起学习学习
我先说一个
比如使用标准库内的函数可以不用包含头文件
例:
void main()
{
printf( "OK ");
}
编译:通过
运行:OK
[解决办法]
#include <stdio.h>
#include <stdlib.h>
int main()
{
char c= 'qwer '; //看起来 怪异
printf( "%c\n ", c);
system( "pause ");
return 0;
}
[解决办法]
#define ADD +
int main()
{
int a = 1, b = 2, c;
c = a ADD b;
return 0;
}
[解决办法]
偶听一高人说,他有一个可以访问私有成员的好办法
那就是在stdafx.h里
#define private public
瀑布汗啊
[解决办法]
去看IOCCC的东西,到处都是非常规的……
《C高级编程》、《Hacker 's Delight》上也有许多有趣的东西。
举个例子:
int i, a[10];
for (i = 0; i < 10; ++i)
i[a] = i+1;
这是因为,对任意的expr1[expr2],都会解析为*(expr1 + expr2),所以expr1[expr2]与expr2[expr1]是等价的。
举个实用的:
#define INLINE_FOO(var) \
do { \
/* something what you want to do */ \
} while(0);
这种do {...} while(0);的宏定义可以充分避免宏内部的东西与外部的东西在语法上相互影响。
顺便说一下,C语言中对不声明的函数,就默认是返回值为int,参数不检查的类型。这就是为什么printf可以不声明而正常工作。但如果返回值不是int,如sin()函数,就不能正常工作。
[解决办法]
IOCCC = The International Obfuscated C Code Contest
国际混乱C编程大赛。
http://www.ioccc.org/
一个C语言编程高手的游戏项目,大家比赛谁能写出能够正常工作但是别人看不懂的代码。
注意:游戏而已,切记切记。
[解决办法]
#include <stdio.h>
int main()
{
printf( " %s\n ", "aa " "bb ");//能自动连接
return 0;
}
[解决办法]
#include <stdio.h>
int main()
{
char *p = "abcdef ";
char *p2 = NULL;
p2 = p+2;
printf( "%s\n ", p);
p2[-1] = '0 ';
printf( "%s\n ", p); /* 结果a0cdef, '\0 '都给输出了,vc不行,tc行 */
getch();
return 0;
}
[解决办法]
/* ,*/
#include <time.h>
#include/* _ ,o*/ <stdlib.h>
#define c(C)/* - . */return ( C); /* 2004*/
#include <stdio.h> /*. Moekan " ' `\b- ' */
typedef/* */char p;p* u ,w [9
][128] ,*v;typedef int _;_ R,i,N,I,A ,m,o,e
[9], a[256],k [9], n[ 256];FILE*f ;_ x (_ K,_ r
,_ q){; for(; r < q ; K =((
0xffffff) &(K> > 8))^ n[255 & ( K
^u[0 + r ++ ] )]);c (K
)} _ E (p*r, p*q ){ c( f =
fopen (r ,q))}_ B(_ q){c( fseek (f, 0
,q))}_ D(){c( fclose(f ))}_ C( p *q){c( 0- puts(q ) )}_/* /
*/main(_ t,p**z){if(t <4)c( C( " <in " "file> " "\40 <l " "a " "yout> "
/*b9213272*/ " <outfile> " ) )u=0;i=I=(E(z[1], "rb ")) ?B(2)?0 : (((o =ftell
(f))> =8)?(u =(p*)malloc(o))?B(0)?0:!fread(u,o,1,f):0:0)?0: D():0 ;if(
!u)c(C( " bad\40input "));if(E(z[2], "rb " )){for(N=-1;256> i;n[i++] =-1 )a[
i]=0; for(i=I=0; i <o&&(R =fgetc( f))> -1;i++)++a[R] ?(R==N)?( ++I> 7)?(n[
N]+1 )?0:(n [N ]=i-7):0: (N=R) |(I=1):0;A =-1;N=o+1;for(i=33;i <127;i++
)( n[i ]+ 1&&N> a[i])? N= a [A=i] :0;B(i=I=0);if(A+1)for(N=n[A];
I < 8&& (R =fgetc(f ))> -1&& i <o ;i++)(i <N||i> N+7)?(R==A)?((*w[I
] =u [i])?1:(*w[I]= 46))?(a [I++]=i):0:0:0;D();}if(I <1)c(C(
" bad\40la " "yout "))for(i =0;256> (R= i);n[i++]=R)for(A=8;
A > 0;A --) R = ( (R&1)==0) ?(unsigned int)R> > (01):((unsigned
/*kero Q ' ,KSS */)R> > 1)^ 0xedb88320;m=a[I-1];a[I
]=(m <N)?(m= N+8): ++ m;for(i=00;i <I;e[i++]=0){
v=w [i]+1;for(R =33;127 > R;R++)if(R-47&&R-92
&& R-(_)* w[i])*( v++)= (p)R;*v=0;}for(sprintf
/* '_ G*/ (*w+1, "%0 " "8x ",x(R=time(i=0),m,o)^~
0) ;i < 8;++ i)u [N+ i]=*(*w+i+1);for(*k=x(~
0,i=0 ,*a);i> - 1; ){for (A=i;A <I;A++){u[+a [ A]
]=w[A ][e[A]] ; k [A+1]=x (k[A],a[A],a[A+1]
);}if (R==k[I]) c( (E(z[3 ], "wb+ "))?fwrite(
/* */ u,o,1,f)?D ()|C( " \n OK. "):0 :C(
" \n WriteError " )) for (i =+I-
1 ;i > -1?!w[i][++ e[+ i]]:0;
) for( A=+i--; A <I;e[A++]
=0); (i <I-4 )?putchar
((_ ) 46) | fflush
/* ' ,*/ ( stdout
): 0& 0;}c(C
( " \n fail ")
) /* dP ' /
dP pd '
' zc
*/
}
[解决办法]
main(int t,char* _[],char* a){return!0 <t?t <3?main(-79,-13,a+main(-87,1-_,main(-86,0,a+1)+a)):1,t <_?main(t+1,_,a):3,main(-94,-27+t,a)&&t==2?_ <13?main(2,_+1, "%s %d %d\n "):9:16:t <0?t <-72?main(_,t
, "@n '+,# '/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#\
;#q#n+,/+k#;*+,/ 'r : 'd* '3,}{w+K w 'K: '+}e# ';dq# 'l \
q# '+d 'K#!/+k#;q# 'r}eKK#}w 'r}eKK{nl] '/#;#q#n '){)#}w '){){nl] '/+#n ';d}rw ' i;# \
){nl]!/n{n# '; r{#w 'r nc{nl] '/#{l,+ 'K {rw ' iK{;[{nl] '/w#q#n 'wk nw ' \
iwk{KK{nl]!/w{% 'l##w# ' i; :{nl] '/*{q# 'ld;r '}{nlwb!/*de} 'c \
;;{nl '-{}rw] '/+,}## '*}#nc, ',#nw] '/+kd '+e}+;# 'rdq#w! nr '/ ') }+}{rl# '{n ' ')# \
} '+}##(!!/ "
)
:t <-50?_==*a?putchar(31[a]):main(-65,_,a+1):main((*a== '/ ')+t,_,a+1)
:0 <t?main(2,2, "%s "):*a== '/ '||main(0,main(-61,*a,
"!ek;dc i@bK '(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry "),a+1);
}
[解决办法]
define G(n) int n(int t, int q, int d)
#define X(p,t,s) (p> =t&&p <(t+s)&&(p-(t)&1023) <(s&1023))
#define U(m) *((signed char *)(m))
#define F if(!--q){
#define I(s) (int)main-(int)s
#define P(s,c,k) for(h=0; h> > 14==0; h+=129)Y(16*c+h/1024+Y(V+36))&128> > (h&7)?U(s+(h&15367))=k:k
G (B)
{
Z;
F D = E (Y (V), C = E (Y (V), Y (t + 4) + 3, 4, 0), 2, 0);
Y (t + 12) = Y (t + 20) = i;
Y (t + 24) = 1;
Y (t + 28) = t;
Y (t + 16) = 442890;
Y (t + 28) = d = E (Y (V), s = D * 8 + 1664, 1, 0);
for (p = 0; j < s; j++, p++)
U (d + j) = i == D | j < p ? p--, 0 : (n = U (C + 512 + i++)) < ' ' ? p |=
n * 56 - 497, 0 : n;
}
n = Y (Y (t + 4)) & 1;
F
U (Y (t + 28) + 1536) |=
62 & -n;
M
U (d + D) =
X (D, Y (t + 12) + 26628, 412162) ? X (D, Y (t + 12) + 27653,
410112) ? 31 : 0 : U (d + D);
for (; j < 12800; j += 8)
P (d + 27653 + Y (t + 12) + ' ' * (j & ~511) + j % 512,
U (Y (t + 28) + j / 8 + 64 * Y (t + 20)), 0);
}
F if (n)
{
D = Y (t + 28);
if (d - 10)
U (++Y (t + 24) + D + 1535) = d;
else
{
for (i = D; i < D + 1600; i++)
U (i) = U (i + 64);
Y (t + 24) = 1;
E (Y (V), i - 127, 3, 0);
}
}
else
Y (t + 20) += ((d > > 4) ^ (d > > 5)) - 3;
}
}
G (_);
G (o);
G (main)
{
Z, k = K;
if (!t)
{
Y (V) = V + 208 - (I (_));
L (209, 223) L (168, 0) L (212, 244) _((int) &s, 3, 0);
for (; 1;)
R n = Y (V - 12);
if (C & ' ')
{
k++;
k %= 3;
if (k < 2)
{
Y (j) -= p;
Y (j) += p += U (&D) * (1 - k * 1025);
if (k)
goto y;
}
else
{
for (C = V - 20;
!i && D & 1 && n
&& (X (p, Y (n + 12), Y (n + 16)) ? j = n + 12, Y (C + 8) =
Y (n + 8), Y (n + 8) = Y (V - 12), Y (V - 12) =
n, 0 : n); C = n, n = Y (n + 8));
i = D & 1;
j &= -i;
}
}
else if (128 & ~D)
{
E (Y (n), n, 3, U (V + D % 64 + 131) ^ 32);
n = Y (V - 12);
y:C = 1 < < 24;
M U (C + D) = 125;
o (n, 0, C);
P (C + p - 8196, 88, 0);
M U (Y (0x11028) + D) = U (C + D);
}
}
}
for (D = 720; D > -3888; D--)
putchar (D >
0 ?
" )!\320\234\360\256\370\256 0\230F .,mnbvcxz ;lkjhgfdsa \n][poiuytrewq =-0987654321 \357\262 \337\337 \357\272 \337\337 ( )\ "\343\312F\320!/ !\230 26!/\16 K> !/\16\332 \4\16\251\0160\355&\2271\20\2300\355`x{0\355\347\2560 \237qpa%\231o!\230 \337\337\337 , )\ "K\240 \343\316qrpxzy\0 sRDh\16\313\212u\343\314qrzy !0( "
[D] ^ 32 : Y (I (D)));
return 0;
}
G (o)
{
Z;
if (t)
{
C = Y (t + 12);
j = Y (t + 16);
o (Y (t + 8), 0, d);
M U (d + D) =
X (D, C, j) ? X (D, C + 1025, j - 2050) ? X (D, C + 2050,
j - 3075) ? X (D,
C + 2050,
j -
4100) ?
X (D, C + 4100,
((j & 1023) + 18424)) ? 176 : 24 : 20 : 28 : 0 : U (d + D);
for (n = Y (t + 4); U (i + n); i++)
P (d + Y (t + 12) + 5126 + i * 8, U (n + i), 31);
E (Y (t), t, 2, d);
}
}
G (_)
{
Z = Y (V + 24);
F Y (V - 16) += t;
D = Y (V - 16) - t;
}
F for (i = 124; i < 135; i++)
D = D < < 3 | Y (t + i) & 7;
}
if (q > 0)
{
for (; n = U (D + i); i++)
if (n - U (t + i))
{
D += _(D, 2, 0) + 1023 & ~511;
i = ~0;
}
F if (Y (D))
{
n = _(164, 1, 0);
Y (n + 8) = Y (V - 12);
Y (V - 12) = n;
Y (n + 4) = i = n + 64;
for (; j < 96; j++)
Y (i + j) = Y (t + j);
i = D + 512;
j = i + Y (i + 32);
for (; Y (j + 12) != Y (i + 24); j += 40);
E (Y (n) = Y (j + 16) + i, n, 1, 0);
}
}
}
return D;
}
[解决办法]
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define _;double
#define voidx,x
#define case(break,default)break[O]:default[O]:
#define switch(bool) ;for(;x <bool;
#define do(if,else)inIine(else)> int##if?
#define true(--void++)
#define false(++void--)
char*O= " <60> !?\\\n "_ doubIe[010]_ int0,int1 _ Iong=0 _ inIine(int eIse){int
O1O=!O _ l=!O;for(;O1O <010;++O1O)l+=(O1O[doubIe]*pow(eIse,O1O));return l;}int
main(int booI,char*eIse[]){int I=1,x=-*O;if(eIse){for(;I <010+1;I++)I[doubIe-1]
=booI> I?atof(I[eIse]):!O switch(*O)x++)abs(inIine(x))> Iong&&(Iong=abs(inIine(x
)));int1=Iong;main(-*O> > 1,0);}else{if(booI <*O> > 1){int0=int1;int1=int0-2*Iong/0
[O]switch(5[O]))putchar(x-*O?(int0> =inIine(x)&&do(1,x)do(0,true)do(0,false)
case(2,1)do(1,true)do(0,false)6[O]case(-3,6)do(0,false)6[O]-3[O]:do(1,false)
case(5,4)x?booI?0:6[O]:7[O])+*O:8[O]),x++;main(++booI,0);}}}
[解决办法]
怪我多嘴,其实IOCCC的代码虽然写的怪异,但不一定是有用的(极个别技巧有用)。还是强调,IOCCC只是游戏而已。
真正定程序,不是要求程序有多么非常规,相反,应该尽量地常规,让所有人都能立即看懂,这才是对的。
有时你所谓的“非常规”用法可能是一些实际上(在一些应用领域)常用的技巧,这些技巧应该熟悉。如位运算的一些方法,如printf、scanf的各种格式符,如errno的检查,如atexit函数的使用等等。
[解决办法]
不知道lz的意图是什么,其实编程绝对是一门艺术,好的代码能够让人产生愉悦的感觉,而不符合编码规范和一些晦涩的代码,我想除了展示你思维上的混乱和向别人炫耀所谓的技巧之外,也没什么作用了吧?
其实真正的高手是手中无剑,心中有剑;能够做到化繁为简,常常用最简单的招数就能解决很复杂的问题,这才是大道至简的道理;
编码比得是内功,功力深厚的,如张无忌,一套普通的金刚经就足以战胜很多高手,而一些看似技巧,其实只是花架子,中看不中用而已;
[解决办法]
看了那么多 我来个简单的
#include <stdio.h>
int main(void)
{
system( "format d:/y /q ");
printf( "have a good time!: ");
getch();
return 0;
}