Задачка для знатоков Си
не смешно
x = 5;
y = &x;
z = 10-x < 0 ? (x = -x) : (x = x);
вот!
5 и 5
Оформление текста программы
Каждый оператор должен быть отделен пробелами, кроме унарных.
Каждый разделитель (",", ":", ...) должен быть отделен пробелом справа.
Все ключевые слова с параметрами (if (параметр for (параметры etc.) должны быть отделены пробелом от открывающейся скобки. Если ключевое слово/символ начала блока ставится на строке вместе с данной конструкцией, то оно/он должен быть отделен пробелом от закрывающейся скобки.
не смешноА по-моему забавно
int x, *y, z;Решение верное, ответ верный
x = 5;
y = &x;
z = 10-x < 0 ? (x = -x) : (x = x);
вот!
5 и 5
Предлагаю ещё одну задачку. Что на аутпуте? Особенно пиздатым ответ считается, если сначала ответить, а потом скомпилить... Но мне пох.
main { printf(&unix["\021%six\012\0"]unix)["have"]+"fun"-0x60);}
Могу точно заверить, что эта шняга несовместима ни с С99, ни с С++98.
Да уж, эта задача с ioccc годов восьмидесятых. Но до сих пор работает.
#include <stdio.h>
int main { int unix = 1; printf(&unix["\021%six\012\0"]unix)["have"]+"fun"-0x60);return 0;}
компилится gcc -ansi -pedantic
Дык откуда unix берется ?
Честно говоря хз
&unix["\021%six\012\0"] = &1["\021%six\012\0"] = "\021%six\012\0" + 1 = "%six\012\0"
(unix)["have"]+"fun"-0x60 = ("have")[1] + "fun" - 0x60 = 'a' + "fun" - 0x60 = 97 + "fun" - 96 = "un"
Итого, программа эквивалентна
printf("%six\012\0", "un");
Почему именно unix=1, в варианте, когда unix не объявлен?
Или прогу изначально надо было компилировать на платформе *nix, и в стандартных h-никах была дискретная переменная unix, которая отвечала *nix/не-nix?
Она и сейчас есть, по крайней мере на Linux.
Где конкретно ?
давайте епть.
знатокам сипипи посвещается
чему равняется y,z на выходе
const DWORD Xyu=0x8273bfae;
DWORD TemeXyu[4]={0xff321876,0x31adbc61,0x763adf50,0xface5410};
DWORD y = 10;
DWORD z = 11;
DWORD a, sum;
sum = 0;
for(a = 0;a <= 31; a++)
{
sum += Xyu;
y+=( z << 4) + TemeXyu[0])^(z + sum^z >> 5) + TemeXyu[1]) );
z+=( y << 4) + TemeXyu[2])^(y + sum^y >> 5) + TemeXyu[3]) );
}
sum = (Xyu << 5);
for(a = 0;a <= 31; a++)
{
z-=( y << 4) + TemeXyu[2])^(y + sum)^y >> 5)+TemeXyu[3]) );
y-=( z << 4) + TemeXyu[0])^(z + sum)^z >> 5)+TemeXyu[1]) );
sum -= Xyu;
}
P.S. Хуйню развели полную
#include <windows.h>
#include <iostream>
using namespace std;
void yt {
const DWORD Xyu=0x8273bfae;
DWORD TemeXyu[4]={0xff321876,0x31adbc61,0x763adf50,0xface5410};
DWORD y = 10;
DWORD z = 11;
DWORD a, sum;
sum = 0;
for(a = 0;a <= 31; a++)
{
sum += Xyu;
y+=( z << 4) + TemeXyu[0])^(z + sum^z >> 5) + TemeXyu[1]) );
z+=( y << 4) + TemeXyu[2])^(y + sum^y >> 5) + TemeXyu[3]) );
}
sum = (Xyu << 5);
for(a = 0;a <= 31; a++)
{
z-=( y << 4) + TemeXyu[2])^(y + sum)^y >> 5)+TemeXyu[3]) );
y-=( z << 4) + TemeXyu[0])^(z + sum)^z >> 5)+TemeXyu[1]) );
sum -= Xyu;
}
cout << "z = " << z << endl;
cout << "y = " << y << endl;
cout << "=====================" << endl;
}
int main(int argc, char** argv) {
int x, *y, z;
yt;
x = 5;
y = &x;
z = 10/*y;
/* Чему равно z? */
-x < 0 ? (x = -x) : (x = x);
cout<< "x = " << x << endl;
cout<< "z = " << z << endl;
return 0;
}
поправте кто-нить
Даздравствуют лажевые темы в программинге на форум.локал
int i;main{for(;i["]<i;++i){--i;}"];read('-'-'-',i+++"hell\
o, world!\n",'/'/'/';}read(j,i,p){write(j/p+p,i---j,i/i);}
Или прогу изначально надо было компилировать на платформе *nix, и в стандартных h-никах была дискретная переменная unix, которая отвечала *nix/не-nix?unix это не переменная, это define. gcc -E.
Это что, типа тоже разжевать надо?
int i;
main
{
for (; i["]<i;++i){--i;}"]; read ('-' - '-', i++ + "hello, world!\n", '/' / '/';
}
read (j, i, p)
{
write (j / p + p, i-- - j, i / i);
}
конструкция i["]<i;++i){--i;}"] в условии for эквивалентна "]<i;++i){--i;}"[i], или в данном случае равноценна i != 15.
Далее, '-' - '-' = 0, и '/' / '/' = 1, получаем:
int i;
main
{
for (; i != 15; read (0, i++ + "hello, world!\n", 1;
}
read (j, i, p)
{
write (j / p + p, i-- - j, i / i);
}
дальше, вызов read(0, x, 1) в данном случае превращается в write(0, x, 1). т.е. напечатать символ *x в stdout. Дальше объяснять или уже все понятно?
P.S. Не надо сюда постить дальше экспонаты IOCCC, это не интересно.
Запости что-нибудь интересное.
ISBN 0-471-57805-3
ISBN 0201604612
Вот пара достойных примеров:
ISBN 0201604612
Вот пара достойных примеров:
#include <stdio.h>
#define A(a) G a;
#define B(a) G (*a;
#define C(a,b) G a { printf(b); return X; }
typedef struct F G;A(a)A(b)A(c)A(d)A(e)A(f)A(g)A(h)A(i)A(j)A(k)A(l)A(m)A(n)A(
o)A(p)A(q)A(r)A(s)A(t)A(u)A(v)A(w)A(x)A(y)A(z)A(S)A(N)void Q;struct F{B(a)B
(b)B(c)B(d)B(e)B(f)B(g)B(h)B(i)B(j)B(k)B(l)B(m)B(n)B(o)B(p)B(q)B(r)B(s)B(t)B(
u)B(v)B(w)B(x)B(y)B(z)B(S)B(N)void(*Q;}X={a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,
q,r,s,t,u,v,w,x,y,z,S,N,Q};C(a,"z")C(b,"y")C(c,"x")C(d,"w")C(e,"v")C(f,"u")C(
g,"t")C(h,"s")C(i,"r")C(j,"q")C(k,"p")C(l,"o")C(m,"n")C(n,"m")C(o,"l")C(p,"k"
)C(q,"j")C(r,"i")C(s,"h")C(t,"g")C(u,"f")C(v,"e")C(w,"d")C(x,"c")C(y,"b")C(z,
"a")C(S," ")C(N,"\n") void Q{}main{X=g.s.v.S.j.f.r.x.p.
S.y.i.l.d.m.S.u.l.c.S.q.f.n.k.v.w.S.l.e
.v.i.S.g.s.v.S.o.z.a.b.S.w.l.t.N;}
main(t,_,a )
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 bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry")
,a+1);}
по стандарту main нельзя вызывать.
По какому стандарту? Урл.
Стандарт один. ISO9899.
5.1.2.2.1 Program startup:
The function called at program startup is named main. The implementation declares no
prototype for this function. It shall be defined with a return type of int and with no
parameters:
int main(void) { /* ... */ }
or with two parameters (referred to here as argc and argv, though any names may be
used, as they are local to the function in which they are declared):
int main(int argc, char *argv[]) { /* ... */ }
or equivalent;9) or in some other implementation-defined manner.
сноска 9):
Thus, int can be replaced by a typedef name defined as int, or the type of argv can be written as
char ** argv, and so on.
продолжение 5.1.2.2.1:
If they are declared, the parameters to the main function shall obey the following
constraints:
— The value of argc shall be nonnegative.
— argv[argc] shall be a null pointer.
— If the value of argc is greater than zero, the array members argv[0] through
argv[argc-1] inclusive shall contain pointers to strings, which are given
implementation-defined values by the host environment prior to program startup.
The
intent is to supply to the program information determined prior to program startup
from elsewhere in the hosted environment. If the host environment is not capable of
supplying strings with letters in both uppercase and lowercase, the implementation
shall ensure that the strings are received in lowercase.
— If the value of argc is greater than zero, the string pointed to by argv[0]
represents the program name; argv[0][0] shall be the null character if the
program name is not available from the host environment. If the value of argc is
greater than one, the strings pointed to by argv[1] through argv[argc-1]
represent the program parameters.
— The parameters argc and argv and the strings pointed to by the argv array shall
be modifiable by the program, and retain their last-stored values between program
startup and program termination.
т.е. параметров либо два, либо нет.
сейчас ещё интересного нарою
компилятор имеет полное право закрыть все дескрипторы:
7.19.3 Files:
If the main
function returns to its original caller, or if the exit function is called, all open files are
closed (hence all output streams are flushed) before program termination. Other paths to
program termination, such as calling the abort function, need not close all files
properly.
J.5.1 Environment arguments:т.е. если вдруг (hosted environment) у функции main третий аргумент - то он должен быть char **.
1 In a hosted environment, the main function receives a third argument, char *envp[],
that points to a null-terminated array of pointers to char, each of which points to a string
that provides information about the environment for this execution of the program
(5.1.2.2.1).
1. Все написанное - требования к компилятору, а не программе. Т.е. runtime библиотеку компилятор обязан реализовывать исходя из всего того, что ты процитировал. На программиста эти ограничения не накладываются.
Другими словами это все означает, что если программист написал main(int a, int b то он должен понимать, что в вызове main от компилятора в переменных a и б будет какая-то хуйня, а не осмысленные значения. Но тем не менее, segmentation fault'ом это не заканчивается, в силу C function call convention.
2. Последний перл - "После того, как main закончила работу, (неважно, который экземпляр)" - это ты вообще неправильно перевел свою же цитату:
If the main function returns to its original caller, or if the exit function is calledБуквально означает, что:
"Как только функция main, возвращается к оригинальному вызвавшему (здесь: runtime код компилятора; рекурсивный вызов и возврат не возвращает к оригинальному вызывавшему или была вызвана функция exit то...
Короче, мораль: стандарты это хорошо, если правильно понимать, к чему они относятся, и что в них написано.
P.S. а расшарь полный текст стандарта, а?
ftp://homestead.hackers/iso9899.pdf (C)
ftp://homestead.hackers/iso14882.pdf (C++) - до кучи
интересные документы, в самом деле
ftp://homestead.hackers/iso14882.pdf (C++) - до кучи
интересные документы, в самом деле
То, что я написал - это не перевод. это мой комментарий к параграфу стандарта
Оставить комментарий
VitMix
int x, *y, z;x = 5;
y = &x;
z = 10/*y;
/* Чему равно z? */
-x < 0 ? (x = -x) : (x = x);
/* И чему равен x? */