LINUX.ORG.RU

gunja@cr:~/Рабочий стол$ gcc --version
gcc (Ubuntu 4.3.2-1ubuntu12) 4.3.2
Copyright (C) 2008 Free Software Foundation, Inc.
Это свободно распространяемое программное обеспечение. Условия копирования
приведены в исходных текстах. Без гарантии каких-либо качеств, включая
коммерческую ценность и применимость для каких-либо целей.

gunja@cr:~/Рабочий стол$ cat tr001.c
#include <stdio.h>

int main() {
        int i;
        i =0;
        i = (i=1) + i;

        printf("%d\n", i);
        return 0;
};

gunja@cr:~/Рабочий стол$ gcc tr001.c
gunja@cr:~/Рабочий стол$ ./a.out
2
gunja@cr:~/Рабочий стол$

gunja
()

в С/С++ запрещено более чем одно обновление одного учатска памяти внутри одного выражения.

-- К.О.

dilmah ★★★★★
()

Начнем с того, что в Си так делать нельзя.

Dudraug ★★★★★
()

предупреждение: операция над ‘i’ может дать неопределенный результат

gcc 4.3

ono
()

Везде 2.

Везде 2, не? Ведь раскрытыие скобок имеет более высокий приоритет, чем сложение.

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

Obfuscated.

>А у кого что выдает i = (i=1)+++i+i+++(i+=1);

Кстати, а есть примеры работающих программ с подобными выражениями с чемпионатов по obfuscated программированию?

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

dudraug@dudraug-laptop:~/temp/test$ cat i.c 
#include <stdio.h>
#include <malloc.h>
#include <limits.h>


int
main(void)
{
     int i=0;
     i=(i=1)+i;
     printf("%i\n ",i );
     return 0;
}
dudraug@dudraug-laptop:~/temp/test$ gcc i.c -Wall
i.c: In function ‘main’:
i.c:10: warning: operation on ‘i’ may be undefined
dudraug@dudraug-laptop:~/temp/test$ ./a.out 
2





Dudraug ★★★★★
()
Ответ на: Obfuscated. от Camel

>Кстати, а есть примеры работающих программ с подобными выражениями с чемпионатов по obfuscated программированию?

Имхо такое может только конченный наркоман написать.

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

>#include <malloc.h>

>#include <limits.h>

Если что это остатки от предыдущего тестового примера.

Dudraug ★★★★★
()
Ответ на: Obfuscated. от Camel

> Кстати, а есть примеры работающих программ с подобными выражениями с чемпионатов по obfuscated программированию?

Судя по 3-м предупреждениям gcc что операция может дать неопределенный результат - глючить будет. Хотя может такими методами винды писаны?

ArtNaiL
()
Ответ на: Еггог. от Camel

>Это двойка, молодой человек.

Это опечатка, двойка тебе за твой предыдущий ответ.

Dudraug ★★★★★
()

руки бы поотрывать за такой код

только вот возился с undified operation в firebird 2.1.2

ибо BuildService не пропускает пакеты в которых при компиляции возникли данные предупреждения

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

Мало.

>i=i++; конечно же.

Вы уверены?

~/prog$ cat prog.c
#include <stdio.h>

int main() {
int i;
i=i++;

printf("%d\n", i);
return 0;
};

~/prog$ gcc prog.c
~/prog$ ./a.out
-1208640079

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

Внимательнее.

>Это опечатка

Компьютер сделает что вы ему скажете, а не то, что вы имеете в виду.

Camel ★★★★★
()
Ответ на: Внимательнее. от Camel

> Компьютер сделает что вы ему скажете, а не то, что вы имеете в виду

это особенно сильно нужно доводить до девушек со "стандартной женской" логикой.

gunja
()
Ответ на: Мало. от Camel

Знаешь, тут по твоей логике должна была быть другая ошибка, что i не объявленно. Но ты его объявил и не проинициализировал? Я же тебе не говорил его объявлять? Но ты его объявил. Так что ты сам не следуешь "четким инструкциям" которые хочешь услышать. Так что не валяй дурака и отвечай что будет.

Dudraug ★★★★★
()
Ответ на: Мало. от Camel

И откуда ты узнал что i - int, а не double? Завязывай с клоунадой, коли не умеешь.

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

>Так низя ни java/c/c++

так _не нужно_ ни java/c/c++

jcd ★★★★★
()

В си вроде вычисление делается справа налево. То есть

i = (i=1) + 0
i = (1) + 1
i = 1

Хотя по логике нужно сначала посчитать значения в скобках

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

Не слишком мало.

>Знаешь, тут по твоей логике должна была быть другая ошибка, что i не объявленно. Но ты его объявил и не проинициализировал? Я же тебе не говорил его объявлять? Но ты его объявил. Так что ты сам не следуешь "четким инструкциям" которые хочешь услышать. Так что не валяй дурака и отвечай что будет.

Я прочёл подсказку, в венгерской нотации переменная с именем i непременно будет int. И таки с каким значением нужно инициализировать i? Нужно угадать? 0,1,2,65535?

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

Хотя если не ошибаюсь повторную инициализацию с не позволяет

DNA_Seq ★★☆☆☆
()

[gotf@halomachine ~]$ cat test.cpp 
#include <iostream>
using namespace std;

int main(){
	int i;
	i = 0;
	i = (i = 1) + i;
	cout << i;
	return 0;
};
[gotf@halomachine ~]$ g++ test.cpp 
[gotf@halomachine ~]$ ./a.out 
2

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

>в С/С++ запрещено более чем одно обновление одного учатска памяти внутри одного выражения.

Если верить выводу gcc, то вовсе не запрещено. Просто результат выполнения не определён.

melkor217 ★★★★★
()
Ответ на: Как? от Camel

Да блин подумал про рекурсию и вызов функции

>И таки раскрытие скобок не важнее?


В паскале, жабе и тд важнее. В си не указано в стандарте поэтому разработчики компиляторов пишут как ИМ удобнее

Кстати, ввиду невозможности повторной инициализации скорее всего будет получен 0

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

>В си вроде вычисление делается справа налево

суть не в этом, суть в том - будет ли скомпилированный в определённом компиляторе код читать значение i всякий раз при обращении к нему. Если будет, то

i = (i=1) + 0
i = (1) + 1
i = 2 //кстати, почему тут было 1? с арифметикой туго? ;)

а если нет, то

i = (i=1) + 0
i = (1) + 0 //в буфере осталось старое значение
i = 1

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

>кстати, почему тут было 1? с арифметикой туго? ;)

очепятка

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

Не программист.

>Неважно чем проинициализируешь, сделай это и скажи чем и ответ. А лучше, не выполняя скажи.

Не выполняя говорю ответ -- 1. Потому что сначала сделается присвоение, потом инкремент.

Инициализирую со значением 0, проверяю, так и есть.

gcc version 4.2.4 (Ubuntu 4.2.4-1ubuntu3)

А теперь вопрос, где будет по-другому?

Camel ★★★★★
()

Turbo C++ выводит 2

jcd ★★★★★
()

>с учетом различных компиляторов

Это уволить на<censored/> пока не поздно.

Deleted
()

В языках, выполняющих вычисления согласно правилам Си будет два.

В Си и Си++ результат не определён. Возможны варианты 0, 1 и 2.

KRoN73 ★★★★★
()
Ответ на: Не программист. от Camel

[dudraug@localhost ~]$ cat i.c 
#include <stdio.h>
char ch;

int main(int argc, char* argv[])
{
    int i=0;
    i=i++;
   printf("%i\n", i);

    return 0;
}
[dudraug@localhost ~]$ gcc-3.4 i.c 
[dudraug@localhost ~]$ ./a.out 
0

Dudraug ★★★★★
()

Free Pascal Compiler version 2.2.4-1 [2009/05/12] for i386
Copyright (c) 1993-2008 by Florian Klaempfl
Target OS: Linux for i386
Compiling inc.pas
inc.pas(5,10) Fatal: Syntax error, ")" expected but ":=" found
Fatal: Compilation aborted

fpc =)

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

>неудивительно - инкремент постфиксный

Так он все равно должен на 1 увеличить i после присваивания.

>gcc на сабж кстати тоже отвечает 2

Если посмотришь внимательно, я тут компилил gcc-3.4

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

>Если посмотришь внимательно, я тут компилил gcc-3.4

Тьфу ты, ты про сабж, просто gcc-4.2 и gcc-4.3 на i=i++; отвечают 1.

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

>Так он все равно должен на 1 увеличить i после присваивания.

Ну так увеличенное значение остается в стеке.

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

>Ну так увеличенное значение остается в стеке.

Так на gcc-4.3 все же увеличивает. Суть в том что если запустить gcc с -Wall то увидим варнинг, что поведение не предсказуемо.

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