Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Анализ программного кода на примере проектов Open Source 2.2-2.8 / 19 сообщений из 19, страница 1 из 1
09.07.2014, 06:52
    #38691326
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анализ программного кода на примере проектов Open Source 2.2-2.8
Здравствуйте. За эту неделю я подробно разобрал главы Спинеллиса 2.2.-2.8, и у меня возникли вопросы по ней. Подскажите пожалуйста, если они не слишком тривиальны.

1.
ex 2.12В языке Perl круглые скобки обязательны во всех управляющих операторах. Изложите ваше мнение по поводу того как это влияет на удобство чтение программ, написанных на Perl


Как я понял, имеют ввиду возможность на Си написать так
Код: plaintext
1.
2.
while(1)
   smth_do();



а на условном Perl с синтаксимом Си, можно было бы только так
Код: plaintext
1.
2.
3.
4.
while(1)
{
   smth_do();
}




Мне кажется что влияет положительно. Раз меньше вариаций для возможности написать конструкцию, значит её проще прочитать. Но мне кажется данный ответ слишком прост. Должна быть какая-то подковырка. Или нет ?

2. Если в среде в VS E 2013 программа или функция компилятора для обнаружения пропущенных операторов break в сблоках switch ?

3. Приведён пример такого кода
Код: plaintext
1.
2.
3.
4.
	for (dp = readir(dd); dp != NULL; dp = readir(dd))
	{

	}



Разве это не аналогично
Код: plaintext
1.
2.
3.
4.
	while (readir(dd))
	{

	}



Зачем так усложнять ?

4. Далее идёт такой участок кода
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
int	nstops;
int	tabstops[100];

static void getstops(char *cp)
{
	int i;

	nstops = 0;
	for (;;) {
		i = 0;
		while (*cp >= '0' && *cp <= '9')
			i = i * 10 + *cp++ - '0';
		if (i <= 0 || i > 256) {
		bad:
			fprintf(stderr, "Bad tab stop spec\n");
			exit(1);
		}
		if (nstops > 0 && i <= tabstops[nstops - 1])
			goto bad;
		tabstops[nstops++] = i;
		if (*cp == 0)
			break;
		if (*cp != ',' && *cp != ' ')
			goto bad;
		cp++;
	}
}



4.1 Почему для преобразования строки в число не используют стандартную функцию atoi ? Ведь вы меня сами учите пользоваться стандартными функциями .
4.2 atoi расшифровывается как ascii to int ? Это мне пришло в голову.
4.3 Есть ли разница между циклами for(;;) and while(1). Мне кажется второй вариант быстрее выполняет каждую итерацию. Эти два цикла всегда взаимозаменяемы и смысловой разницы нет никакой и никогда ? Я полагаю есть разница только во времени выполнения.
4.4 Зачем printf приводят, я знаю что она возвращает число выведенных символов, ну и пусть возвращает, нам то что ?
4.5 ex 2.24Функция getstops выдаёт одно и то-же сообщение по поводу разных ошибок. Предложите способ сделать её более информативной и в то же время избавиться от оператора goto...


я преобразовал так, но выглядит паршиво. Можно ведь лучше ?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
static void getstops2(char *cp)
{
	int i;
	nstops = 0;
	while(1) 
	{
		i = 0;
		while (*cp >= '0' && *cp <= '9')
		{
			i = i * 10 + *cp++ - '0';
		}

		if (i <= 0 || i > 256) 
		{
			fprintf(stderr, "comment1\n");
			exit(1);
		}
		if (nstops > 0 && i <= tabstops[nstops - 1])
		{
			fprintf(stderr, "comment2\n");
			exit(1);
		}

		tabstops[nstops++] = i;

		if (*cp == 0)
		{
			break;
		}
			
		if (*cp != ',' && *cp != ' ')
		{
			fprintf(stderr, "comment3\n");
			exit(1);
		}
		cp++;
	}
}



5. Далее говорят про оператор goto.
5.1 Существуют ли алгоритмы которые нельзя реализовать без этого оператора ?
5.2 Говорят мол в Джава так не любят этот оператор, что его там и вовсе нет. Я проверил, switch то оставили, что они как немцы с двойными стандартами к России. Тогда бы и его убирали. Одно и то-же в принципе.
6. Последний вопрос, приведён кусок кода из \netbsdsrc\lib\libc\net\getservent.c

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
again:
	if ((p = fgets(line, BUFSIZ, servf)) == NULL)
		return (NULL);
	if (*p == '#')
		goto again;
	cp = strpbrk(p, "#\n");
	if (cp == NULL)
		goto again;
	*cp = '\0'; ...
        return (&serv);



комментарий к этому коду
Спинеллис... где в бд системы разыскивается запись, соответствующая системной службе, с игнорированием комментариев и слишком длинных строк.(Интересно, что приведённый выше код, похоже содержит ошибку. Если прочитана только часть строки, то следующей операцией будет чтение её остатка. Этот остаток может иметь требуемую длину и будет воспринят как корректная запись. Подобные нарушения часто становятся лазейками для нарушителей системной безопасности )

Код мне понятен, ошибка, если действительно идёт усечение слишком длинных строк скорее всего есть.

Пришлось изучить функции fgets and strpbrk.
INTERNATIONAL STANDARD ©ISO/IEC ISO/IEC 9899:201x 7.24.5.4 The strpbrk function
Synopsis
1 #include <string.h>
char *strpbrk(const char *s1, const char *s2);
Description
2 The strpbrk function locates the first occurrence in the string pointed to by s1 of any
character from the string pointed to by s2.
Returns
3 The strpbrk function returns a pointer to the character, or a null pointer if no character
from s2 occurs in s1.


INTERNATIONAL STANDARD ©ISO/IEC ISO/IEC 9899:201x 7.21.7.2 The fgets function
Synopsis
1 #include <stdio.h>
char *fgets(char * restrict s, int n,
FILE * restrict stream);
Description
2 The fgets function reads at most one less than the number of characters specified by n
from the stream pointed to by stream into the array pointed to by s. No additional
characters are read after a new-line character (which is retained) or after end-of-file. A
null character is written immediately after the last character read into the array.
Returns
3 The fgets function returns s if successful. If end-of-file is encountered and no
characters have been read into the array, the contents of the array remain unchanged and a
null pointer is returned. If a read error occurs during the operation, the array contents are
indeterminate and a null pointer is returned.


6.1 Судя по этому коду у fgets есть побочный эффект, она двигает указатель внутри файла, почему об этом побочном эффекте не написано в стандарте, или я не заметил этого ?
6.2 Решил сам реализовать strpbrk, без побочного эффекта. Проверьте пожалуйста, код ниже похож на правду ?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
char* strpbrk(const char* s1, const char* s2)
{
	const char* s_s1 = s1;
	const char* s_s2 = s2;
	while (*s_s1)
	{
		while (*s_s2)
		{
			if (*s_s1 == *s_s2)
			{
				return (char*)s_s1;
			}
			s_s2++;
		}
		s_s1++;
		s_s2 = s2;
	}
	return NULL;
}



6.3 Почему у неё такое название? Не могу расшифровать вторую часть.

PS
Встретил несколько ошибок пока читал
1. стр 51, 1 абзац.
стр 51Поэтому переменные в которые помещаются результаты вызова этих функций должны быть целочисленными , а не символьными, чтобы хранить как все возможные символы так и коды ошибок..(речь идёт о переменной в которую пишется результат из функции getc )

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

2.стр 471, п29

стр 471Циклы записанные в форме
Код: plaintext
1.
for(i=0;i<n;i++)


выполняются ровно n раз


Это тоже ошибка, ибо такой цикл выполнится n/2 раз
Код: plaintext
1.
2.
3.
4.
for(i=0;i<n;i++)
{
i++;
}
...
Рейтинг: 0 / 0
09.07.2014, 07:47
    #38691345
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анализ программного кода на примере проектов Open Source 2.2-2.8
Тухумхау, но лично меня не очень устраивает и:
Код: sql
1.
2.
3.
4.
5.
6.
if ( ... ) {
  ...
}
else {
  ...
}

и:
Код: sql
1.
2.
3.
4.
5.
if ( ... ) {
  ...
} else {
 ...
}

Вариант "все скобки блоков на отдельных строках" добавляет неэстетичные пустоты.
В общем, хотелось бы, чтобы ключевые слова then, else и, возможно, elif начинали блок , заканчивающийся (другим) else, elif или end:
Код: sql
1.
2.
3.
4.
5.
if
  ...
then
  ...
end;

С while - примерно тоже:
Код: sql
1.
2.
3.
4.
5.
while
  ...
do
  ...
end;

Не, существующий вариант красотища для коротких условий и операторов:
Код: sql
1.
2.
if ( ... ) ...;
while ( ... ) ...;

Но лично я не настолько талантлив
...
Рейтинг: 0 / 0
09.07.2014, 08:41
    #38691392
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анализ программного кода на примере проектов Open Source 2.2-2.8
Basil A. Sidorov,

если выкинуть точки с запятой - получится бейсик
...
Рейтинг: 0 / 0
09.07.2014, 10:23
    #38691520
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анализ программного кода на примере проектов Open Source 2.2-2.8
В бэйсике, вроде, оператор, а не блок.
Но в целом - да, условные операторы и циклы должны работать с блоками, ограниченными ключевыми словами, а не с отдельными операторами.
То, что последовательность операторов можно превратить в блок, рассматриваемый как один оператор, само по себе проблемы не решает:
Код: sql
1.
2.
3.
4.
5.
if ( очень сложное && очень длинное условие );
{
  ...
  ...
}
...
Рейтинг: 0 / 0
10.07.2014, 03:37
    #38692599
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анализ программного кода на примере проектов Open Source 2.2-2.8
SS4.3 Есть ли разница между циклами for(;;) and while(1). Мне кажется второй вариант быстрее выполняет каждую итерацию. Эти два цикла всегда взаимозаменяемы и смысловой разницы нет никакой и никогда ? Я полагаю есть разница только во времени выполнения.


провел сегодня эксперимент.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
int main(int argc, char** argv)
{
	int i = 0;
	clock_t s = clock();
	for (;;)
	{
		i++;
		if ((i ^ 0xffffffff) == 0)
		{
			break;
		}
	}
	clock_t e = clock();
	double res = (e - s)*CLOCKS_PER_SEC;
	printf("%f", res);
}


1. 20 436 000
2. 17 116 000
3. 16 333 000
4. 16 177 000
5. 16 676 000

6. 17 378 000
7. 20 076 000
8. 15 849 000
9. 17 065 000
10. 16 667 000

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
int main(int argc, char** argv)
{
	int i = 0;
	clock_t s = clock();
	while (1)
	{
		i++;
		if ((i ^ 0xffffffff) == 0)
		{
			break;
		}
	}
	clock_t e = clock();
	double res = (e - s)*CLOCKS_PER_SEC;
	printf("%f", res);
}



1. 16 067 000
2. 16 863 000
3. 16 270 000
4. 16 426 000
5. 16 629 000

6. 17 221 000
7. 17 565 000
8. 17 799 000
9. 17 097 000
10. 17 119 000


Проводил эксперименты пятёрками.
1. Обратите внимание на разброс значений в первом случае. И на стабильность во втором случае. Конечно нужно провести 1000 экспериментов чтобы делать выводы, но для начала можно сказать что время выполнения цикла while(1) возможно более предсказуемо чем for(;;)
...
Рейтинг: 0 / 0
10.07.2014, 04:41
    #38692606
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анализ программного кода на примере проектов Open Source 2.2-2.8
Хотя если дизассемблировать
Код: asm
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
while (1)
012814A7  mov         eax,1  
012814AC  test        eax,eax  
012814AE  je          main+55h (012814C5h)  
	{
		i++;
012814B0  mov         eax,dword ptr [i]  
012814B3  add         eax,1  
012814B6  mov         dword ptr [i],eax  
		if ((i ^ 0xffffffff) == 0)
012814B9  mov         eax,dword ptr [i]  
012814BC  xor         eax,0FFFFFFFFh  
012814BF  jne         main+53h (012814C3h)  
		{
			break;
012814C1  jmp         main+55h (012814C5h)  
		}
	}
012814C3  jmp         main+37h (012814A7h)  



и

Код: asm
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
for (;;)
	{
		i++;
00CF14A7  mov         eax,dword ptr [i]  
00CF14AA  add         eax,1  
00CF14AD  mov         dword ptr [i],eax  
		if ((i ^ 0xffffffff) == 0)
00CF14B0  mov         eax,dword ptr [i]  
00CF14B3  xor         eax,0FFFFFFFFh  
00CF14B6  jne         main+4Ah (0CF14BAh)  
		{
			break;
00CF14B8  jmp         main+4Ch (0CF14BCh)  
		}
	}
00CF14BA  jmp         main+37h (0CF14A7h)  



Есть некоторая разница. И это странно.
...
Рейтинг: 0 / 0
10.07.2014, 06:08
    #38692610
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анализ программного кода на примере проектов Open Source 2.2-2.8
Думалось, что компилятор поймёт что это бесконечный циклы в обоих случаях, и заменит оба выражения на одинаковый машинный код.
...
Рейтинг: 0 / 0
10.07.2014, 07:23
    #38692622
m_Sla
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анализ программного кода на примере проектов Open Source 2.2-2.8
SashaMercury, чем дизассемблировал?

Собирай release версию и дизассемблируй exe файл c помощью IDA Pro free.
mingw вообще весь цикл выкинул:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
void test_while()
{
	MessageBoxA(NULL,"while(1)","while(1)",MB_OK);

	unsigned int i = 0;
	clock_t s = clock();

	while (1)
	{
		i++;
		if ((i ^ 0xffffffff) == 0)
		{
			break;
		}
	}
	clock_t e = clock();
	double res = (e - s)*CLOCKS_PER_SEC;
	printf("%f\r\n", res);
}

.text:00401440 test_while      proc near               ; CODE XREF: sub_401500:loc_40176Dp
.text:00401440
.text:00401440 var_28          = dword ptr -28h
.text:00401440 var_24          = qword ptr -24h
.text:00401440 var_1C          = dword ptr -1Ch
.text:00401440 var_C           = dword ptr -0Ch
.text:00401440 var_4           = dword ptr -4
.text:00401440
.text:00401440                 push    ebp
.text:00401441                 mov     ebp, esp
.text:00401443                 push    ebx
.text:00401444                 sub     esp, 24h        ; hWnd
.text:00401447                 mov     [esp+28h+var_1C], 0
.text:0040144F                 mov     dword ptr [esp+28h+var_24+4], offset aWhile1 ; "while(1)"
.text:00401457                 mov     dword ptr [esp+28h+var_24], offset aWhile1 ; "while(1)"
.text:0040145F                 mov     [esp+28h+var_28], 0
.text:00401466                 call    MessageBoxA
.text:0040146B                 sub     esp, 10h        ; char *
.text:0040146E                 call    clock
                                        цикл отсутствует 
.text:00401473                 mov     ebx, eax
.text:00401475                 call    clock
.text:0040147A                 mov     [esp+28h+var_28], offset aF ; "%f\r\n"
.text:00401481                 sub     eax, ebx
.text:00401483                 imul    eax, 3E8h
.text:00401489                 mov     [ebp+var_C], eax
.text:0040148C                 fild    [ebp+var_C]
.text:0040148F                 fstp    [esp+28h+var_24]
.text:00401493                 call    printf
.text:00401498                 mov     ebx, [ebp+var_4]
.text:0040149B                 leave
.text:0040149C                 retn
.text:0040149C test_while      endp


...
Рейтинг: 0 / 0
10.07.2014, 08:16
    #38692647
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анализ программного кода на примере проектов Open Source 2.2-2.8
Дизассемблировал в VS, во время отладки появляется возможность посмотреть ассемблерный код
...
Рейтинг: 0 / 0
10.07.2014, 12:37
    #38693012
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анализ программного кода на примере проектов Open Source 2.2-2.8
Отладки и оптимизация - две вещи несовместные.
Пусть генерит ассемблерный листинг для релизной компиляции.
...
Рейтинг: 0 / 0
10.07.2014, 13:21
    #38693095
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анализ программного кода на примере проектов Open Source 2.2-2.8
SashaMercury, есть понятие code-style.
Это устоявшиеся предпочтения в группе разработчиков.

Код: plaintext
1.
2.
while(1)
   smth_do();



В нашей группе например есть обязательное правило ставить фигурные
скобки в блоках for, if, while.

Эти правила - что-то вроде этикета.
...
Рейтинг: 0 / 0
10.07.2014, 13:54
    #38693170
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анализ программного кода на примере проектов Open Source 2.2-2.8
maytonВ нашей группе например есть обязательное правило ставить фигурные скобки в
блоках for, if, while.

Эти правила - что-то вроде этикета.
Особенно это этично в отношении с MS VS, у которой при отсутствии нужных скобок начинает
путаться автоматический расставлятор отступов.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.07.2014, 15:42
    #38693414
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анализ программного кода на примере проектов Open Source 2.2-2.8
SashaMercury,


Данные фрагменты кода не идентичны. Т.к. во втором кейсе ты пропустил выражение инициализации.
Кроме того их результирующий код зависит от контекста. К примеру если был внешний цикл то
компиллятор будет вынужден сохранять loop variable где-то в памяти и соотв исключит какие-то
оптимизации.

Код: plaintext
1.
2.
3.
4.
	for (dp = readir(dd); dp != NULL; dp = readir(dd))
	{

	}


Код: plaintext
1.
2.
3.
4.
	while (readir(dd))
	{

	}


Кроме того, очевидно что этот вопрос - compiller depends и нужно его смотреть после того
как брошен клич - "Маски - долой!" и ты покажешь --help --version своих тулзов
и опций компиллятора.
...
Рейтинг: 0 / 0
10.07.2014, 15:59
    #38693461
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анализ программного кода на примере проектов Open Source 2.2-2.8
SashaMercury

SashaMercuryПочему для преобразования строки в число не используют стандартную функцию atoi ? Ведь вы меня сами учите пользоваться стандартными функциями .

Данный кусок кода
Код: plaintext
1.
2.
while (*cp >= '0' && *cp <= '9')
			i = i * 10 + *cp++ - '0';


является примером недоброкачественной конвертера. Он не контролирует максимальную длину строки *cp
но при этом формирует десятичное умножение на целое имеющее лимиты по сетке. Он не контролирует
принадлежность символов *cp диапазону [:digit:] и соотв выдаёт undefined behavior.

Такой код писать нельзя. Или можно писать с оговоркой. С оговоркой что входная строка *cp
гарантирует свою пригодность к подобного рода конверсии.

По сабжу atoi - это те же яйца но они хотя-бы выделены в отдельную функцию и их глюки
известны.
...
Рейтинг: 0 / 0
10.07.2014, 16:06
    #38693484
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анализ программного кода на примере проектов Open Source 2.2-2.8
SashaMercuryЕсть ли разница между циклами for(;;) and while(1). Мне кажется второй вариант быстрее выполняет каждую итерацию. Эти два цикла всегда взаимозаменяемы и смысловой разницы нет никакой и никогда ? Я полагаю есть разница только во времени выполнения.
Не парься. Этот вопрос не стоит внимания. Пиши как тебе удобно а наносекунды
не повлияют на твой основной алгоритм. Основное мясо вычислений приходится на тело
цикла которое будет всё равно тысячекратно тяжелее.
...
Рейтинг: 0 / 0
10.07.2014, 19:05
    #38693752
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анализ программного кода на примере проектов Open Source 2.2-2.8
SashaMercury,
5. Далее говорят про оператор goto.
5.1 Существуют ли алгоритмы которые нельзя реализовать без этого оператора ?
Существуют конкретные примеры алгоритмов которые с явным оператором goto
выглядят компактно и вполне читабельно. Автор статьи на Хабре хорошо прошёлся
по нескольким случаям.

http://habrahabr.ru/post/114211/

Всё остальное - холивары и битва идеологий.
...
Рейтинг: 0 / 0
10.07.2014, 19:27
    #38693764
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анализ программного кода на примере проектов Open Source 2.2-2.8
SashaMercury 5.2 Говорят мол в Джава так не любят этот оператор, что его там и вовсе нет. Я проверил, switch то оставили, что они как немцы с двойными стандартами к России. Тогда бы и его убирали. Одно и то-же в принципе.

Goto в Java language существует. Однако он используется для "разрыва" системы вложенных циклов.

В спецификации опкодов JVM goto существует аж в двух вариантах goto [offset_16bit], goto_w [offset_32bit] и судя
по описанию не ограничивается контекстами циклов. Тоесть можно использовать везде.
...
Рейтинг: 0 / 0
10.07.2014, 19:34
    #38693771
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анализ программного кода на примере проектов Open Source 2.2-2.8
Данный код
Код: plaintext
1.
2.
3.
4.
5.
for(i=0;i<n;i++)
{
     // loop body
     i++;
}



по смыслу может быть преобразован в
Код: plaintext
1.
2.
3.
4.
5.
6.
for(i=0;i<n;)
{
     // loop body
     i++;
     i++;
}



Или в более цивильный вариант.
Код: plaintext
1.
2.
3.
4.
for(i=0;i<n;i+=2)
{
     // loop body
}
...
Рейтинг: 0 / 0
14.07.2014, 01:59
    #38695572
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анализ программного кода на примере проектов Open Source 2.2-2.8
mayton, спасибо. я понял
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Анализ программного кода на примере проектов Open Source 2.2-2.8 / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]