Премини към съдържанието
От 1-ви септември 2021 г., вход във форумите ще е възможен само с имейл адрес вместо потребителско име. Ако не помните имейла с който сте се регистрирали, вижте го в настройките на профила си. ×
  • Добре дошли!

    Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

    Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

     

Помощ C


Fr0s7Blad3

Препоръчан отговор


Здравейте,
Ако може малко да помогнете, някой да ми обясни от посочените две програми резултатите, които ще се отпечатът как по точно се получават резултатите.

Знам някой как стават, но ....

1.
 

#include <stdio.h>

float func(int *a, int *b, float *t)

{

    (*a)+=2/(++(*b)); (*b)-=((*t)-15)*2; (*t)+=2+(*a)+(*b);

    printf ("7: %d  %d  %f\n",*a,*b,*t);

    return *a;

}

int main()

{

    short x, y, tab[]= {-12,6,34,99}, *p=tab;

    float z;

    y=3; z=7.0; x = (y-- != --z);

    printf("1: %d,%d,%f\n",x,y,z);

    x=1; y=1; z=4.0;

    printf("2: %d %d %f\n",x && --y ||z, x,z);

    y=15;

    if(!y)

    {   x=3;

        *z=fun(&x,&y,&z);

    }

    else *z=(y++>8);

    printf("3: %3d,%3d,%3f\n",x,y,z);

    x=y=8;

    while(++y > 1) x-=y;

    printf("4: %d  %d\n",x,y);

    for(x=0,y=8; y>=1; x++,y/=6);

    printf("5: %d  %d\n",x,y);

    printf("6:%d,%d, %d\n",*(p+3), *(tab+1), *(tab+2)/2);

    x=3; y=1;

    fun(&x,&y,&z);

    printf("8: %d %d %d\n",x,y,fun(&x,&y,&z));

    return 0;

}


2.

#include <stdio.h>

short fun(short *a, short *b)

{

    static int t=1;

    (*a)+=2; (*b)-=2; t+=2;

    printf ("7: %d  %d  %d\n",*a,*b,t);

    return *a;

}

int main()

{

    short x, y, z, tab[]= {-12,6,34,99}, *p=tab;

    y=z=3; x = (y-- != --z);

    printf("1: %d,%d,%d\n",x,y,z);

    x=1; y=1; z=3;

    printf("2: %d %d %d\n",x && --y ||z, x,z);

    y=1;

    if(!y)

    {   x=4;

        fun(&x,&y);

    }

    else z=(y++>8);

    printf("3: %3d,%3d,%3d\n",x,y,z);

    x=y=2;

    while(++y < 11) x+=y;

    printf("4: %d  %d\n",x,y);

    for(x=0,y=8; y>=1; x++,y/=6);

    printf("5: %d  %d\n",x,y);

    printf("6:%d,%d\n",*(p+2), *(tab+1));

    x=3; y=1;

    fun(&x,&y);

    printf("8: %d %d %d\n",x,y,fun(&x,&y));

    return 0;

}



 

Линк към коментара
Сподели в други сайтове

Здравейте !

 

Имах нервите да проследя само по първата програма нещата как вървят. И искрено се надявам, че това не е код, който ще види бял свят, както и стил на програмиране, на който Ви обучават. 

#include <stdio.h>

//Предаването на short указател като int указател си е драма. Говорим за типове, който заемат различно количество памет, което води до страхотни проблеми.
//Приложил съм в кода по-долу резултата от int*, като в самата функция съм разписал случая, когато работим с short* указатели.
float func(int *a, int *b, float *t) { //(x=3, y=1, z=1) // Ако е short* short* float*
	(*a) += 2 / (++(*b)); //a = a + (2/2)(целочислено делене) = 4 (x)
	(*b) -= ((*t) - 15) * 2; // b = 2 - ((1-15)*2) = 1 - (-28) = 30 (y)
	(*t) += 2 + (*a) + (*b); // t = t(1) + 2 + a(4) + b(30) = 1 + 2 + 4 + 30 = 37
	printf("7: %d  %d  %f\n", *a, *b, *t); // 4 30 37.0000
	return *a; //4
}

int main() {
	short x, y, tab[] = { -12, 6, 34, 99 }, *p = tab;
	float z;
	y = 3;
	z = 7.0;
	x = (y-- != --z); // x = 1 (true), y = 3, но на долния ред ще е вече 2, z = 6
	printf("1: %d,%d,%f\n", x, y, z); // 1, 2, 6.0000
	x = 1;
	y = 1;
	z = 4.0;
	printf("2: %d %d %f\n", x && --y || z, x, z); //x=1, y=0, z = 4
	// 1 && 0 => 0 (false), 0 || 4 => 1 (true) //Краен резултат: 1, 1, 4.000
	y = 15;
	if (!y) { // !true => false
		x = 3;
		z = func(&x, &y, &z);
	} else
		z = (y++ > 8); // z = 1 (15 > 8 e true), y на следващия ред ще е 16
	printf("3: %3d,%3d,%3f\n", x, y, z); // 1, 16, 1.0000, като имаме и форматиране на изхода.
	x = y = 8; // x = 8, y = 8
	while (++y > 1) // Става мазало ... y ще се инкрементира, докато overflow-не в -32768
		x -= y; // x = x - y Това се изпълнява 32760 пъти, като x overflow-ва няколко хиляди пъти ...
	printf("4: %d  %d\n", x, y); // Това, според изпълнение е 16428, а y си е -32768
	for (x = 0, y = 8; y >= 1; x++, y /= 6); //Цикъла се изпълнява 2 пъти, за y = 8 и y = 8/6 = 1 (целочислено делене).На трета итерация: x = 2, y = 1/6 = 0 (целочислено делене)
	printf("5: %d  %d\n", x, y); // 2 0
	printf("6:%d,%d, %d\n", *(p + 3), *(tab + 1), *(tab + 2) / 2); // tab[3] tab[1] (tab[2]/2) => 99 6 17
	x = 3;
	y = 1;
	func(&x, &y, &z); //(x=3, y=1, z=1) // Ако func се остави във вида int* int* float*, резултатите са катастрофални. -15728637  196638  -15531996.000000
	printf("8: %d %d %d\n", x, y, func(&x, &y, &z)); // Още по - голямо мазало: 7: -15728164  31260661  503.000000, 8: 476 -11 -2147483648
	return 0;
}

Имайте предвид и още нещо - при различните компилатори, може да има разлики в изпълнението и резултатите. В моя случай съм ползвал MinGW.

За другата програма, логиката ми изглежда доста подобна на тази и мисля, че ще може да я проследите.

 

Поздрави !

 

//EDIT: Поправка на реда

printf("2: %d %d %f\n", x && --y || z, x, z);

тъй като съм приел погрешно префиксния оператор за постфиксен.

Линк към коментара
Сподели в други сайтове

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

×
×
  • Добави ново...

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите Условия за ползване