LINUX.ORG.RU

Язык Си - никогда не поздно удивляться


1

2

Как вы думаете, какой результат напечатает программа?

#include <stdio.h>

int main()
{
  int a=0,b,c=0,d;
  b = a++ + a++ + ++a;
  d = c+ ++c + ++c;
  printf("a=%d b=%d c=%d d=%d\n", a,b, c,d);
  return 0;
}

Может быть тема и для development, но результат настолько поразил, что руки сами набрали talks.

Перемещено mono из talks

★★★

Последнее исправление: alman (всего исправлений: 1)

вот это баян так баян.

x0r ★★★★★
()
Ответ на: комментарий от abacaba

Проблемы у тех авторов, которые полагаются на UB

Не тупи. Это не UB, это фича (отсутствие определенного порядка вычисления). UB - это как раз таки только если доступ к памяти или переменным перекрывается, как в примере у ТС.

anonymous
()
Ответ на: комментарий от superhackkiller1997

любля я эту статью http://ershov.iis.nsk.su/russian/second_literacy/article.html

вот вот этот абзац тут к месту :

В докнижный период единство слова и дела осуществлялось естественно и постоянно. Накопление опыта и знания было совмещено с прямым и постоянным контактом старшего учителя и младшего ученика.

и следующий за ним

Появление книги нанесло сильнейший удар единству слова и дела, отделило процесс накопления знаний от их применения, создало новые формы жажды и знаний и новые ощущения постижения истины.

Во всех языках появились специальные определения для людей, которые в своем стремлении к знанию отдавали предпочтение книге. Во всех этих выражениях, от «книжного ума» до «яйцеголовых», был оттенок пренебрежения, в целом несправедливого, но иногда и заслуженного.

qulinxao ★★☆
()
Ответ на: комментарий от abacaba

UB для сохранения(и продолжения роста на все платформы которые адекватны С-модели машины) С-комьюнити своего достигнутого положения.

qulinxao ★★☆
()

Как вы думаете, какой результат напечатает программа?

Undefined behaviour

anonymous
()
Ответ на: комментарий от anonymous

С какой такой радости? Никто не запрещает иметь неопределенный порядок вычисления аргументов и в постфиксной нотации.

anonymous
()
Ответ на: комментарий от anonymous

Какую букву ты не понял?

Описываемая «проблема» (на самом деле никакой проблемы нет) связана с UB при конфликтующих сайд-эффектах при вычислении аргументов. От синтаксиса это не зависит никак, никоим образом.

Итак, к чему был твой взвяк про постфиксную нотацию?

anonymous
()
Ответ на: комментарий от cdshines

по-твоему, (а++ ++а +) сразу решит все проблемы?


a++ это переменная или операция?
++а это переменная или операция?
+ операция?

Возможно, вы хотели сказать: а ++ a ++ + ?
где : ++ dup @ 1+ swap ! ;
или : ++ 1 swap +! ;

anonymous
()
Ответ на: комментарий от anonymous

на самом деле никакой проблемы нет

конечно, конечно... никаких проблем

От синтаксиса это не зависит никак, никоим образом.

да, да, да... Это компилятор во всём виноват, ага.

anonymous
()
Ответ на: комментарий от anonymous

конечно, конечно... никаких проблем

Так и будешь пердеть, или мысль свою все таки изложишь человеческим языком?

да, да, да... Это компилятор во всём виноват, ага.

Ты, судя по всему, тупой. Повторяю для тупых: эта «проблема» к синтаксису никакого отношения не имеет. UB связано с неопределенностью порядка вычисления аргументов функций и бинарных операторов.

anonymous
()
Ответ на: комментарий от anonymous

сорри, пьян.

рабочий код:

variable a
5 a !
: ++ dup 1 swap +! @ ;
a ++ a ++ + .
13  ok

anonymous
()
Ответ на: комментарий от cdshines

Как для такой нотации записать унарные операторы, аналогичные по действию ++а и а++?

что-то вроде этого:

: ++! dup 1 swap +! @ ;
: !++ dup @ swap 1 swap +! ;

variable a
5 a !

a !++  a ++!  + . 
12  ok

a @ . 
7  ok

anonymous
()
Ответ на: комментарий от qulinxao

я так понял, это просто определенные аналоги функций? ну так если я вместо операторов инкремента напихаю в код функций, аналогичных по действию, но с определенным уже порядком вызова, то мне опять неважна форма записи?

anonymous
()
Ответ на: комментарий от anonymous

определенным уже порядком вызова, то мне опять неважна форма записи.

qulinxao ★★☆
()
Ответ на: комментарий от anonymous

того же SSA нет и в помине

Альфред В. Ахо, Моника С. Лам, Рави Сети, Джеффри Д. Ульман - Компиляторы. Принципы, технологии и инструментарий 2-е издание, стр. 457, 6.2.4 Представление в виде статических единственных присваиваний

Ты или не читал того о чем говоришь или хотел найти в книге конца 80-х упоминание о том, что появилось в конце 90-х.

anonymous
()

b = a++ + a++ + ++a;

UB

d = c+ ++c + ++c;

UB

andreyu ★★★★★
()

Оо. маиндфак на си уууиииии

Вот тебе еще один: коммутативность скобочек

array[10] можно написать как 10[array]

unt1tled ★★★★
()

Да этим ещё дед меня в детстве троллил!

Deleted
()
Ответ на: комментарий от unt1tled

0[a+i][a+j]

#include <stdio.h>
#define N 8
#define M 4
#define sz (N+1)*(M+1)
int a[sz];
int main(){
	int i,j;
	for(i=0;i<sz;i++)a[i]=(i/(M+1))*1000+i%(M+1);

	for(i=0,j=0;i<=N;i++,j+=(M+1))a[i]=j;

	for(i=1;i<=N;i++){
		for(j=0;j<M+1;j++)
			printf("%d ",0[a+i][a+j]);
		printf("\n");
	}
	return 0;
}
qulinxao ★★☆
()
Ответ на: комментарий от unt1tled

i[a][a+j] не так семетрично

а в целом идея для 2ух уровненого дерева вполне практичная

первые k элемента это ссылки на листы вектора.

недостаток в сравнении со стандартным [x*ny+y] лишняя косвенность на этапе исполнение.

достоинство обмен строк в матрице тривиален.

если упарыватся лиспом то

car от cons-ячейки j это a[j][a+0]
сdr от cons-ячейки j это a[j][a+1]

ну и следовательно

сaaar это a[j][a+0][a+0][a+0]

caddr это a[j][a+1][a+1][a+0]

всё оказывается связано .

qulinxao ★★☆
()
Последнее исправление: qulinxao (всего исправлений: 1)
Ответ на: 0[a+i][a+j] от qulinxao

И тебя ни разу не смущает необходимость дважды писать имя массива?

anonymous
()

Прочитал как «Язык Си - никогда не поздно удавиться». Много думал.

anonymous
()

Что сказать то хотел?

erfea ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.