Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.63
Tamara333
3 / 3 / 0
Регистрация: 27.12.2010
Сообщений: 22
#1

Инкрементация (не могу понять почему так?) - C++

16.01.2011, 16:01. Просмотров 2949. Ответов 30
Метки нет (Все метки)

Гуру в программировании на C++ начала изучать язык, и сразу вопросы
почему при выполнении

C++
1
2
3
4
5
6
7
8
9
10
11
#pragma argsused
#include <conio.h>
#include<iostream.h>
 
int main()
{
 int a=0;
 printf("%d \n%d \n%d \n%d \n%d \n%d \n%d",a,a++,a++,a++,a++,a++,a++);
 getch();
 return 0;
}


выдает

6
5
4
3
2
1
0

а не наоборот
0
1
2
3
4
5
6

???

Добавлено через 22 минуты
с нетерпением жду ответа =)
2
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.01.2011, 16:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Инкрементация (не могу понять почему так?) (C++):

Символьные литералы, указатели и функция. Не могу понять, почему именно так - C++
Доброго времени суток всем! :) Изучаю С++, всегда стараюсь добить до последнего код, чтобы не было непоняток. Но сейчас наткнулся на...

не могу понять что не так((((( - C++
привет всем! у меня проблемка возникла компиятор никак не проглатывает мой код #include &lt;iostream&gt; using namespace std; int main() ...

не могу понять что не так - C++
задание такое : Структура &quot;книга почтой&quot;:-наименование книги;-ФИО автора;-номер по каталогу;-издательство;-колличество в...

Не могу понять почему - C++
Есть кода программы(код взят разобраться): #include&lt;iostream&gt; using namespace std; class coord { protected: public: int x,y; ...

Не могу понять почему... - C++
#include &quot;stdafx.h&quot; void main() { funct(); _getch(); } void funct() {

Не могу понять, почему? - C++
Доброго времени суток=) Такая печаль. Создается класс Окружность с полями радиус, площадь и длина окружности. Нужно создать функции...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
16.01.2011, 16:27 #2
Tamara333, UB потому что...
http://alenacpp.blogspot.com/2005/11...ce-points.html
1
no0ker
101 / 88 / 4
Регистрация: 17.12.2010
Сообщений: 416
16.01.2011, 16:27 #3
мне кажется, что извлечение аргументов из стека происходит согласно спецификаторам строки. соответственно в стек первым заносится (либо вычисляется) последний аргумент.

C
1
2
3
4
5
6
int main(){
    int a=0;
    printf("%d",a,a++,a++,a++,a++,a++,a++);
 
    return 0;
}
а в этом примере, после занесения в стек всех аргументов, первым для снятия будет a=6;
0
Temirlan90
132 / 132 / 8
Регистрация: 30.09.2010
Сообщений: 333
16.01.2011, 16:30 #4
ForEveR, рахмет за ссылку)
0
no0ker
16.01.2011, 16:35
  #5
4
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
16.01.2011, 16:53 #6
no0ker, И все же это неопределенное поведение.

C++
1
2
3
4
5
6
7
8
9
10
#include <conio.h>
#include<iostream>
 
int main()
{
int a=0;
std::cout<<a<<' '<<a++<<' '<<a++<<' '<<a++<<' '<<a++<<' '<<a++<<' '<<a++;
getch();
return 0;
}
Добавлено через 46 секунд
И вот это.

C++
1
2
3
4
5
6
7
8
9
10
#include <conio.h>
#include<iostream>
 
int main()
{
int a=0;
std::cout<<a<<' '<<++a<<' '<<++a<<' '<<++a<<' '<<++a<<' '<<++a<<' '<<++a;
getch();
return 0;
}
Вообщем не стоит так писать.

Добавлено через 5 минут
А вот в соответствии со стандартом.
после каждого изменения переменной идет прохождение через точку следования
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <conio.h>
#include<iostream>
 
int main()
{
int a=0;
std::cout<<a<<' ';
std::cout<<a++<<' ';
std::cout<<a++<<' ';
std::cout<<a++<<' ';
std::cout<<a++<<' ';
std::cout<<a<<'\n';
getch();
return 0;
}
0
no0ker
101 / 88 / 4
Регистрация: 17.12.2010
Сообщений: 416
16.01.2011, 17:15 #7
не могли бы вы пояснить связь между printf и cout? вы считаете эти примеры эквивалентными?
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
16.01.2011, 17:27 #8
no0ker, нет конечно) Я наверное не в тему высказался. Я высказывался по конкретно этому примеру. printf/cout эквивалентны лишь в том, что выводят информацию в поток.
0
Tamara333
3 / 3 / 0
Регистрация: 27.12.2010
Сообщений: 22
16.01.2011, 17:36  [ТС] #9
так проблема и состоит в том, что я не могу увидеть логики именно исполбзуя printf
все равно спасибо, что то новое для себя открыла =)
0
no0ker
101 / 88 / 4
Регистрация: 17.12.2010
Сообщений: 416
16.01.2011, 17:36 #10
у меня , к сожалению, нет возможности проверить во всех компиляторах, но в mingw и vs 2008, результат данного примера предсказуем.

C
1
2
3
4
5
6
int main(){
        int a=0;
        printf("%d",a,a++,a++,a++,a++,a++,a++);
 
        return 0;
}
неужели есть компилятор который выдаст другое значение, нежели "6"?
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
16.01.2011, 17:40 #11
no0ker, Быть может. Но то, что это UB мне кажется неосморимо
0
Tamara333
3 / 3 / 0
Регистрация: 27.12.2010
Сообщений: 22
16.01.2011, 17:58  [ТС] #12
Сходила по ссылке и все сразу стало понятно
ОГРОМНОЕ спасибо, а то давно меня мучает этот вопрос =)
0
no0ker
101 / 88 / 4
Регистрация: 17.12.2010
Сообщений: 416
16.01.2011, 18:53 #13
ForEveR, в статье криса касперски есть вот такой момент

"Для поддержки функций с переменным количеством аргументов в языке Си был принят обратный порядок заталкивания параметров в стек, т.е. самый левый аргумент заносится в последнюю очередь и оказывается на верхушке стека."

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

или это чистое UB? (исходя из определения, как попытка изменения переменной между точками следования)
1
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
16.01.2011, 19:00 #14
no0ker, А вот вопрос... Скорее все же UB, но подкрепленное еще и этим...
Ведь в примере с cout вывод такой же как и printf, т.е. последовательность в обратном порядке. И с файлом полагаю будет аналогично.
0
+c+
112 / 22 / 3
Регистрация: 20.11.2010
Сообщений: 1,294
16.01.2011, 19:08 #15
наверно printf как и cout требует законченное выражение (точки следования)
C++
1
2
int i=0;
cout <<  ++i << 'i' << ++i << ++i <<endl;
выведет:
3i21
поэтому сначало полностью вычисляется i и заносится в стек, с последующим снятием со стека!
ссылка
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.01.2011, 19:08
Привет! Вот еще темы с ответами:

Обьясните что не так не могу понять - C++
программа должна менять цвет bmp файла но при запуске выдает ошибку что 2 неразрешимых внешних элемента есть и все я пробовал разобраться...

Не могу понять, что не так в коде - C++
Целый день маюсь с этой прогой и ничё не выходит. #include &lt;iostream&gt; #include &lt;windows.h&gt; using namespace std; int main() { ...

Не могу понять почему не запускается - C++
Программа не запускается, скажите пожалуйста где ошибка? #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;iostream&gt; using...

Не могу понять почему не работает - C++
#include &lt;iostream&gt; #include &lt;string&gt; using namespace std; const int arrSize = 15; int main() { string Phone; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
16.01.2011, 19:08
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru