Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.04.2017, 20:46   #1
Marcus_95
Новичок
Джуниор
 
Регистрация: 30.04.2017
Сообщений: 1
Лампочка a+=b

всем привет!

я новичек..

чтобы была ясна суть моего вопроса.начну вот с чего:

Сложение, совмещённое с присваиванием: a += b , или же так: a = a + b
Это есть одно и тоже! Разобрались!

теперь сам код (в правильном виде):

Код:
#include <iostream>
#include <string>


using namespace std;




int main()
{
	


	std::string original = "Hello World! Don't forget to subscribe to mausy131 :D";
	std::string encrypted;
	std::string decrypted;
	std::string newOriginal;
	char key = 'x'; 


	for (int i = 0; i < original.size(); ++i) {
		encrypted += original[i] ^ (int(key) + i) % 3; 
	}
	cout << "Here is my secret that nobody may know: \n\n" << encrypted << endl;

	cout << "\nHere is the decrypted string: \n" << endl;

	for (int i = 0; i < encrypted.size(); ++i) {
		decrypted += encrypted[i] ^ (int(key) + i) % 3;
	}

	cout << endl << decrypted << endl;

	cin.get();
	return 0;
}
теперь сам код (в неправильном виде наколдованный мной):

Код:
#include <iostream>
#include <string>


using namespace std;




int main()
{
	


	std::string original = "Hello World! Don't forget to subscribe to mausy131 :D";
	std::string encrypted;
	std::string decrypted;
	std::string newOriginal;
	char key = 'x'; 


	for (int i = 0; i < original.size(); ++i) {
		encrypted = encrypted + original[i] ^ (int(key) + i) % 3; 
	}
	cout << "Here is my secret that nobody may know: \n\n" << encrypted << endl;

	cout << "\nHere is the decrypted string: \n" << endl;

	for (int i = 0; i < encrypted.size(); ++i) {
		decrypted += encrypted[i] ^ (int(key) + i) % 3;
	}

	cout << endl << decrypted << endl;

	cin.get();
	return 0;
}
а теперь кусок кода где я наколдовал:

Код:
encrypted = encrypted + original[i] ^ (int(key) + i) % 3;
где я допустил ошибку?
всем заранее спасибо!!!

Последний раз редактировалось Аватар; 30.04.2017 в 21:03.
Marcus_95 вне форума Ответить с цитированием
Старый 01.05.2017, 01:07   #2
Haric_110
Форумчанин
 
Регистрация: 03.03.2013
Сообщений: 102
По умолчанию

Рискну предположить, что дело в приоритетах выполнения операторов
в случае
Код:
encrypted += original[i] ^ (int(key) + i) % 3;
выполняется сначала операция сложения по модулю ^ (и преобразование в int), а потом сложение (конкатенация) с присваиванием
в случае же
Код:
encrypted = encrypted + original[i] ^ (int(key) + i) % 3;
сначала выполняется конкатенация, а затем сложение по модулю (числа со строкой). Получается, что оператор '^' не перегружен для операндов "строка - int"

Если написать:
Код:
encrypted = (encrypted + original[i])[i] ^ (int(key) + i) % 3;
то всё будет хорошо
Haric_110 вне форума Ответить с цитированием
Старый 01.05.2017, 01:21   #3
Haric_110
Форумчанин
 
Регистрация: 03.03.2013
Сообщений: 102
По умолчанию

Кстати, для обычных типов данных так же:
если сравнивать приоритеты операций '=', '+', '+=' и '^', то получим
П('=') == П('+=)
П('+=') < П('^') < П('+'),
то есть, сначала выполняется сложение, затем сложение по модулю, а потом присваивание или сложение с присваиванием.

https://ru.wikipedia.org/wiki/Операторы_в_C_и_C%2B%2B
Haric_110 вне форума Ответить с цитированием
Старый 01.05.2017, 01:21   #4
Haric_110
Форумчанин
 
Регистрация: 03.03.2013
Сообщений: 102
По умолчанию

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

Последний раз редактировалось Haric_110; 01.05.2017 в 01:26. Причина: В результате бага предыдущий пост "продублировался"
Haric_110 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц