Southmountain Ответов: 2

Простой вопрос о передаче указателя на функцию в VC++


Я провел простой тест на передачу указателя на функцию в VC++ с помощью Visual Studio 2017. Я думал, что это очень просто, но оказалось не так, как ожидалось...

#include <iostream>

int incr10(int* num);

using namespace std;

int main(void)
{
	int num = 3;
	int* pnum = &num

	cout << endl
		<< "addressed passed =:" << pnum;

	cout << endl
		<< "incr10(pnum) = " << incr10(pnum)
		<< endl
		<< "num= " << num;  //this is not expected value 13

	cout << endl
		<< "*pnum is :" << *pnum;

	cout << endl;
	return 0;
}

//function to increment a variable by 10
int incr10(int* num)
{
	cout << endl
		<< "addressed received=:" << num;

	*num += 10;

	return *num;
}

Я ожидаю num = 13, потому что это значение обновляется внутри функции incr10, но оно все еще num=3.

может быть, я что-то пропустил? или стандарт C++ обновлен на этом термине?

Что я уже пробовал:

Я попробовал, и это бросило вызов моему пониманию этого аргумента о прохождении указателя.
Я получил этот результат из распечатки экрана:
addressed passed =:00D1FB74
addressed received=:00D1FB74
incr10(pnum) = 13
num= 3
*pnum is :13

Joe Woodbury

Это кажется правильным. Я запустил его в VC++ 17, и он работал так, как ожидалось. (Я смутно задаюсь вопросом, была ли проблема с порядком выполнения cout. Попробуйте разделить вывод num на его собственную строку и посмотреть.)

Shao Voon Wong

Это происходит потому, что число появляется в первый раз, прежде чем incr10() называется. Попробуйте установить стандарт C++ на C++17. В C++17, порядок выполнения не гарантируется.

KarstenK

напишите его в качестве ответа ;-)

2 Ответов

Рейтинг:
13

OriginalGriff

Это становится сложным, но ... это связано с порядком оценки.
Как только я исправлю синтаксическую ошибку - вам не хватает точки с запятой в этой строке:

int* pnum = &num

Немного изменив свой код, вы сможете увидеть проблему более четко:
#include <iostream>

int incr10(int* num);

using namespace std;

int main(void)
{
	int num;
	int* pnum = #

    num = 3;
	cout << "incr10(pnum) = " << incr10(pnum) << endl
	     << "num= " << num  
	     << endl;
	     
    num = 3;
	cout << "incr10(pnum) = " << incr10(pnum) << endl;
	cout << "num= " << num << endl;
	
    num = 3;
    incr10(pnum);
	cout << "num = " << num << endl;
	return 0;
}

//function to increment a variable by 10
int incr10(int* num)
{
	*num += 10;
	return *num;
}
Давать результат:
incr10(pnum) = 13
num= 3
incr10(pnum) = 13
num= 13
num = 13

Что показывает проблему. Это еще более ясно в меньшем примере:
#include <iostream>

using namespace std;
int A() { cout << "A" << endl; return 1; }
int B() { cout << "B" << endl; return 2; }
int main(void)
{
    cout << A() << B();
	return 0;
}
Что дает вам:
B
A
12

Показывая, что результат B вычисляется прежде чем результат А.

Порядок оценки не определен, поэтому эта проблема может возникнуть только в некоторых компиляторах: я использовал gdb компилятор, который вычисляет справа налево, но другие могут работать наоборот!
Порядок оценки - cppreference.com[^]


CPallini

5.

Southmountain

спасибо тебе, ОГ! отсутствующая точка с запятой вызвана копированием кода в это текстовое поле, некоторые символы потерялись, и я вручную набрал &num и забыл это ";".

Рейтинг:
0

CPallini

Также взгляните на эту страницу: Точка последовательности - Википедия[^].


Southmountain

спасибо, что поделились этой ссылкой!