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

Вопросы по С++ и не только (~40 вопросов) - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Autoit to C++ http://www.cyberforum.ru/cpp-beginners/thread633457.html
Здравствуйте, кто знает Autoit, перепишите на с++ пожалуйста) Func GETWOWBASEADDRESS($PID) $HSNAP = DllCall("Kernel32.dll", "HANDLE", "CreateToolhelp32Snapshot", "DWORD", 8, "DWORD", $PID) $STMODULE = DllStructCreate("DWORD dwSize;DWORD th32ModuleID;DWORD th32ProcessID;" & "DWORD GlblcntUsage;DWORD ProccntUsage;ptr modBaseAddr;" & "DWORD modBaseSize;HANDLE hModule;WCHAR szModule;" &...
C++ Статическая переменная в шаблоне // // (---.Array_hpp---) // #ifndef Array_HPP // Preprocessor gates #define Array_HPP #include <sstream> #include <iostream> #include <exception> http://www.cyberforum.ru/cpp-beginners/thread633421.html
расчет значения e^x(x это степень) C++
есть задача,в котором нужно рассчитать значение e^x. Проблема в том что я даже понятие не имею что это такое это экспоненто в степени x. Но, недавно написал программу которая высчитывает экспоненту по факториалу. Вот сама программа: // программа для высчитывания мат. константы - е #include <iostream> #include <locale.h> using namespace std; int main() { setlocale(LC_ALL, "RUS");
Получение числа из переменной C++
К примеру: int s=326; Как можно получить числа 3,2 и 6? ( Я делаю небольшую игру и мне необходимо это для вывода очков )
C++ Битовое ИЛИ. Пердача нескольких констант в один параметр функции http://www.cyberforum.ru/cpp-beginners/thread633374.html
здраствуйте! иногда в примерах програмного кода замечаю, что несколько констант передаются в один парметр функции с помщью битового или. так, например, изучая понемногу d3dx9 решил всетаки спросить в чем хитрость такого механизма? думаю посмотрев пару строчек кода ниже вы поймете о чем я. bool Display(float timeDelta){ if(Device){ Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,...
C++ Считывание символов из строки Здравствуйте, форумчане. Можете подсказать, каким образом можно считать из RichTextBox символы до какого либо знака-разделителя, записать их в переменную и потом, после этого знака, тоже считать и записать в другую переменную? Т.е. чтобы строка "9995882323//babai@mail" читалась как номер, записанный в одной переменной, и почта, в другой переменной, а потом считывание переходило бы на новую... подробнее

Показать сообщение отдельно
csrnsdrfg1
4 / 4 / 0
Регистрация: 30.03.2012
Сообщений: 34

Вопросы по С++ и не только (~40 вопросов) - C++

06.08.2012, 00:44. Просмотров 775. Ответов 4
Метки (Все метки)

Накопилось пару вопросов по языку. Буду благодарен за качественный ответ хотя бы на 1 вопрос. При ответе, указывайте пжлст номер.


1) char arr [] = "qwerty" эквиваленто char arr [] = {'q', 'w', 'e', 'r', 't', 'y', '\0'};
Как компилируется вариант1 и вариант2? Всмысле, когда компилятор натыкается на каждый из вариантов, он каждый из них сразу транслирует, или сначала, например, переводит вариант1 в эквивалентный вариант2 (или наоборот) а потом транслирует?
Просто, как я думал, язык С (CPP) немногословен. Ну т.е., например, чтобы объявить массив, надо следовать четкой инструкции, или, даже если инструкций несколько, то каждая из них в чем-то хоть различна (массив можно объявить статическим или динамическим образом - 2 разные инструкции и результаты разные). А тут получается, два разных способа, которые полностью индиентичны (или нет?).

2) в чем разница:
char arr [80] = "d";
и
char arr [80] = {"d"}; //или просто стандарт разрешает опускать скобки при инициализации одномерных чаровских массивов?

Неужели компилятор во втором случае просто игнорирует скобки? Хоть что-то они должны значить!

3) struct {
signed : 1;
} str;
В "Язык C++" (Прата) (да и в некоторых других серьезных источниках) написано, что битовое поле с длиной 1 не может быть знаковым (знаковыми могут быть только от 2ух). Но компилятор не выдает ошибку. Почему?

4) while (getchar () != -1);
буферизированный ввод. после комбинации СИМВОЛ + [CTRL + Z] цикл все равно продолжается. почему? (символ - любой не спецсимвол на клавиатуре).

5) enum en {a, b, c} x;

cout << (x = (en) 1551); //Что тогда предсталяют из себя перечисления, если результат
м.б. не определенным? Какова структура (не всмысле struct, а устройство) перечислений?

6) в учебнике сказано, что для перечислений с небольшим диапозоном может отводится <1байта.

Даже в этой конструкции:
enum {a} x;
cout << sizeof x;
Значение = 4б (и вообще, у меня получалось только либо sizeof int, либо sizeof long long - никаких промежуточных значений)

7) Почему int *a = new int;
delete [] a;
по стандарту не определено ?

8) операция new заносит куда-то адреса, которые были выделены (в противном случае, delete
не знал бы, что удалять. Например, при выделении памяти под массив из 20ти ячеек, delete
(при правильном использовании) точно знает размер массива). Где эта информация хранится и
как ее можно оттуда достать?

9) Как работает операция sizeof? Как она отличает массив из n -cимволов и просто указатель?

10) int b [1];

cout << b << endl << &b; // и b и &b - одинаковые адреса

Если единичный массив (его имя) - указатель, который ссылается сам на себя, где же он тогда хранит значение int?? Иначе: в указателе b лежит значение его адреса, т.е. логично, что при осуществлении операции *b мы попадем на все тот же b, но на практике это не так!!!! Притом - присем, если сделать так:
int* a = (int*) &a; // по идее, то же самое, что и int b [1]
cout << a << endl << &a << endl;
*a = 5;
cout << a << endl << &a;

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

Чем же тогда отличается int* a = (int*) &a от int b [1]?? //ну кроме того, что имя массива - константный указатель, в отличии от первого.

10) Почему будет не определенный результат, если память выделенную в куче
(напр. с помощью new) освободить дважды (delete'ом)?
11) Условия циклов приводятся к булевскому значению или целому? т.е.,
a) while (5 < 8) // след действие --> while (true) ....
или
б) while (5 < 8) // след действие --> while (1) ....
Конечно, по сути, это одно и тоже. true трактуется как 1 (в общем случае
как что угодно, кроме ноля), а false как 0, но тем не менее, хотелось бы точно знать,
к какому типу данных приводится (в конечном итоге) выражение в скобках.

12) Почему возможны операции:
++*x и (*x)++ // x - указатель на int
я рассуждал так:в обоих этих случаях сначала устанавливатся доступ по адресу, которое
возвращает (а м.б. тут ничего не возвращается?!) значение, лежащее по адресу. Операция
инкрементирования (в обоих случаях побочный эффект в конце) равнозначна следующему:
Y++ (или ++Y) тоже, что и Y = Y + 1; (постфиксное и префиксное в контексте, указанном ниже,
не меняет сути - побочный эффект в конце выражения). Иными словами, если *x = 5, то:
++*x == ++5 == 5 = 5 + 1 // попытка присваивания rvalue значения.
Помогите разобраться.

13) Как работает такая схема:
while (int u = 1) ;
и почему тогда не работает такая:
cout << (int u = 1);

14) int main ()
{
int main () ;
int main () ; //......
}

Как это вообще работает? по сути, я написал прототипы мейн в самом определении мейн. Как это ерунда вообще компилируется?!

15)
ининциализация - не просто последовательное выполнение двух операций (объявление и
присваивание)?
Такой код не работает:
(int a) = 5; //почему?

16)
const int a = 5;
int* b = (int*) &a;
*b = 4; //Компил здесь ошибки не выдал
cout << &a << " :: " << b << endl;

cout << a << " :: " << *b;

КАК по одному адресу может находится 2 разных числа?!

17)
template <typename name> void func__ (name const & a)
{
*a = 8;
}


int main ()
{
int a = 2;
func__ (&a); //Т.к. передается не сама переменная, а ее адрес (т.е. rvalue), то в памяти выделяется
безымянная переменная (для того, чтобы шаблон ф-ии мог брать ссылку на фактический аргумент - т.е. &a).
Но в таком случае, компилятор требует спецификатора const для того, чтобы я не мог изменять значения
формального параметра, т.к. эти изменения приведут лишь к изменению той самой безымянной переменной.
Если не написать const, компилятор пишет соответствующую ошибку. Но дело в том, что я написал в шаблоне
(name const & a) а не (const name & a) и все-равно все заработало. Почему?

std :: cout << a;
}

18) Я объявил регистровую переменную. Если где-то в программе я пытаюсь взять ее адрес, то:
а) При компиляции компилятор систематически не сделает ее регистровой, даже если на то позволяет сис-ма
б) Сделает какую-то махинацию (я где-то слышал, что он может создавать копию регистровой переменной в оп. памяти)? Если да, то собственно какую.

19) Когда-то инициализация static переменной другой переменной запрещена, так же в качестве аргумента case (в switch) не могла выступать переменная. Почему это когда-то было запрещено (причина), а теперь разрешено?

20)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "myglobal.txt"
 
int static a = 65;
 
int main ()
{
 
cout << a;
 
}
 
//File "myglobal.txt"
 
int static a = 5;
//----------------------
Ошибка: redefinition of 'int a'|

Область видимости переменной (а), объявленной в myglobal.txt распространяется только на этот файл.
Компилятор говорит об обратном. Разве внешние статическиене распространяются только на тот файл, где они
объявлены?

21) как адресный new (с аргументом) узнает о размере буффера? Напр:

C++
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
char* sys_buffer = new char [5000];
.....
int* p1 = new (sys_buffer) int; //Откуда new знает о размере массива?
 
22) void exp (int status = 1);
 
namespace nmsp
{
    void func ()
    {
    cout << "Hello, i am func () declared in namespace (nmsp) \n";
    }
}
 
void func ()
{
cout << "Hello, i am a simple func () \n";
}
 
int main ()
{
exp ();
exp (0);
}
 
void exp (int status)
{
if (status)
    {
    using nmsp::func;     //Здесь nmsp-ешная перекрывает обыную.
    func ();
    }
else
    {
    using namespace nmsp;
    func ();               //Компил не знает, какую из ф-ий выбрать (ambiguous).
    }
}
Почему возникает различие (какого устройство using) при подключении пространства имен или конкретного
объекта (в данном случае).

23) Почему нельзя объявлять пр-во имен (в т.ч. и неименованное) а так же ф-ии внутри блока (напр. в теле ф-ии)?

24)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void func (int a, char b, short c, double d, void* f)
{
//cout << &n << endl << (void*) &a << endl << (void*) &b << endl << (void*) &c;
 
printf (" int :: %d \n char :: %d \n short :: %d \n double :: %d \n void* :: %d \n", &a, &b, &c, &d, &f);
}
 
int main ()
{
char arr [10] = {'A', 'B', 'C'};
 
func (5000, 'a', (short) 5, .001, (void*) 0);
}
Почему формальные аргументы func () располагаются в памяти не последовательно? Ведь значения, передаваемые ей,
пихаются в стек.

25) Зачем при присваивании одного объекта класса другому и при инициализации объекта класса с помощью
операции " = " некоторые компляторы создают временный объект?

26)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Cls
{
string h;
 
public:
Cls (string);
 
};
 
int main ()
{
const Cls x ("asddas");               //Успешная инициализация
const Cls z = Cls ("asddas");         //Успешная инициализация  
 
const Cls y = (string) "asd";         //Работает только с привидением типа (т.е. вот этим - (string)). В противном случае:
//conversion from 'const char [4]' to non-scalar type 'const Cls' requested
//Почему эта ошибка высветилась и почему тогда первый и второй случай инициализации работают без привидения типа?
}
 
Cls :: Cls (string)
{
/*Empty constructor*/
}
27)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Cls2
{
int _i;
 
public:
 
int i, g;
 
Cls2 (int c__i, int c_i)
{
_i = c__i, i = c_i;
}
 
private:
 
int _g;
};
 
int main ()
{
Cls2 x (100200, 1);
 
cout << *(&x.i - 1);
}
Почему тогда говорится, что классы обеспечивают защиту данных?

28) Как создать массив битовых полей?

union
{
long long a;

unsigned bit1 : 1;
unsigned bit2 : 1;
unsigned bit3 : 1;

.....copypast?
} un;

29)
C++
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
int func ()
{
int x;
 
return x;
}
 
 
int main ()
{
func () = 7; //Ошибка. Оно и понятно, попытка присваивания lvalue значения.
}
 
//а здесь уже интересней:
 
struct str
{
int a;
} a = {1}, b = {2};
 
str func ()
{
str a;
 
return a;
}
 
int main ()
{
func ().a = 7; //no error (если бы ф-ия возвращала const str тогда error была бы, а так нет)
}
 
//Более того:
 
class Cls
{
int a;
 
public:
 
Cls (int c_a = 0)
{
a = c_a;
}
 
Cls operator+ (Cls& aa)
{
Cls bb;
 
cout << "\n operands : " << a << " and " << aa.a;
 
this -> a = 7; //Во второй раз меняется уже lvalue
 
bb.a = aa.a + a;
 
cout << endl << " bb.a = " << bb.a << endl;
 
return bb;
}
 
};
 
int main ()
{
Cls a (1), b (2), c (3);
 
a.operator+ (b).operator+ (c); //теперь уже явный пример изменения lvalue
}
Почему для собственных типов можно изменять lvalue (хотя это даже по определению невозможно)? Или возвра
щается не lvalue? Чего вообще происходит-то? Как это работает?

30) Где находится информация о типе данных константы (напр: 5, -777, "строковый литерал")
и просто переменной?

31) Почему операции "=" "[]" "()" "->" перегружаются только для ф-ий - членов (например, в своей программе я могу не использовать операцию "[]" и хочу ее переопределить)?

32) Почему недопустима запись:

class.....
{
.....

class_type& friend operator<< (..... /*Хотя допустима без ссылки или если friend стоит левее возвращаемого значения operator*/

};

33)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Cls
{
int a;
 
public:
 
friend ostream&  operator<< (ostream&, Cls& A);
};
 
ostream& operator<< (ostream& out, Cls& A)
{
out <<  "operator<< (ostream& out, Cls& A) :: A.a is :: " << A.a << endl;
return out;
}
Почему этод код работает только тогда, когда operator<< принимает ссылку на ostream и возвращает ссылку
на него (а не просто принимает по значению и возвращает значение).


34) Мне надо, чтобы конструктор класса определял значения по умолчанию одной из ф-ий - методов. Как это
реализовать? Напр:

class Cls
{
public:

Cls () ..... //constructor

void func (int x = @) //@ - параметр по умолчанию, который во время компиляции не определен.
}

35) Почему sizeof класса, в котором нет переменных == 1?
Почему sizeof класса, в котором только 1 переменная == sizeof переменной (т.е. даже без того 1 байта, что вверху), а при нескольких переменных
sizeof всегда кратен 4 (хотя у меня 64бит сис-ма)?

36) Почему (в классах) explicit недоступно для метода operator name_of_type () ?


37) Почему стандарт определяет неявное приведение типа для класса, имеющего конструктор с одним аргументом
(например: Cls a; a = 5, но не определяет для остальных конструкторов (например, стиль в данном случае
мог бы быть таким же, как и для структур. Например : struct str {...}; str a = {... , ... , .....})?

38) Почему ф-ия метод operator type_to_from_class_type () может (по идее и должна) иметь return, но тип возвращаемого значения для нее нету. как компилятор узнает, сколько места надо выделить ей для возвращаемого значения?

39) int func (short a [5])
{
}

Что обозначает сигнатура этой ф-ии?

//-------------------------------------------------------------------------------------------------------
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 13:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru