2017-02-09 10 views
-1

Я хочу сохранить значение исходного значения X при выполнении вычислений с помощью X, как это сделать? Посоветуйте! Ура! // addon Я получил решение своего вопроса через полезные stackoverflowpeeps. Первоначально я думал, что x будет меняться в значение каждый модуль i или делить его. Однако они описывают объяснение мне через пропуск по значению!Как сохранить значение оригинала x, используя x для выполнения вычислений?

Обратитесь к C++ verify creditcard via LUHN Formula (Loop & SumToken Error), чтобы узнать, как я использовал функцию.

int newDigits (int x) 
{ 
    int newNumber, length; 
    int secondDigit, fourthDigit; 
    secondDigit = x%1000/100*2; 
    fourthDigit = x%10*2; // Edited as per advised 
    if ((secondDigit<10)&&(fourthDigit<10)) 
    { 
     newNumber = (x%10000/1000*1000)+(secondDigit*100)+(x%100/10*10)+(fourthDigit); 
    } 
    else if ((secondDigit>10)&&(fourthDigit<10)) 
    { 
     newNumber = (x%10000/1000*10000)+(secondDigit*100)+(x%100/10*10)+(fourthDigit); 
    } 
    else if ((secondDigit<10)&&(fourthDigit>10)) 
    { 
     newNumber = (x%10000/1000*10000)+(secondDigit*1000)+(x%100/10*100)+(fourthDigit); 
    } 
    else if ((secondDigit>10)&&(fourthDigit>10)) 
    { 
     newNumber = (x%10000/1000*100000)+(secondDigit*1000)+(x%100/10*100)+(fourthDigit); 
    } 

    return newNumber; 
} 
+0

Сделайте копию, прежде чем изменять ее? – NathanOliver

+3

В вашем сообщении 'x' не изменяется. –

+1

Где находится 'x'? – PaulMcKenzie

ответ

0

Прежде всего, вы не изменяете значение x в любом месте вашей функции int newDigits (int x). Вы используете только значение, хранящееся в x, для выполнения других вычислений; эти какуляции не изменяют значение, хранящееся в x вообще. Строки в вашем коде, где используется x:

secondDigit = x%1000/100*2; 
    fourthDigit = x%10*2; 
    newNumber = (x%10000/1000*1000)+(secondDigit*100)+(x%100/10*10)+(fourthDigit); 
    newNumber = (x%10000/1000*10000)+(secondDigit*100)+(x%100/10*10)+(fourthDigit); 
    newNumber = (x%10000/1000*10000)+(secondDigit*1000)+(x%100/10*100)+(fourthDigit); 
    newNumber = (x%10000/1000*100000)+(secondDigit*1000)+(x%100/10*100)+(fourthDigit); 

ничего не меняет значение x; x в конце этих операций совпадает. Величина х может быть изменено только если вы что-то вроде

х + = а

х ++

х - = а

х * = а

х/= a

etc ...(Предполагают, чтобы быть постоянным число)

Просто делать что-то вроде:

int a = (x + 2)/x; 

не изменит значение x.

Однако, если вы хотите, чтобы убедиться, что значение, которое передается в x сохраняется, то вы можете сделать это 2 способами:


Первый метод является использование const перед x, как вы говорите в своем вопросе. Это решает вашу проблему сохранения значения x во всей функции; однако это также означает, что вы не можете изменить значение x (если вам нужно). В этом случае, если вы не уверены, что не хотите и не хотите изменять x, вы можете использовать этот метод. Если вы решили использовать константу, то изменить объявление функции для:

int newDigits (const int x) 

Второй метод бы просто объявить еще одну переменную типа int в начале вашей функции и установите его равным х, как:

int newDigits (int x) 
    { 
     int y = x; // This way, you do can modify x knowing that you can look back to y if you need the original value 

     // Rest of the function code 
    } 

Основываясь на ссылке, вы писали об остальной части кода, я не уверен, что вы хотите, чтобы мы сделали с ним; это не имеет никакого значения для моего ответа. Если вам нужно больше разъяснений, дайте мне знать в поле для комментариев.

2

Назначение в C++ обычно ориентировано на значение. Заявление int x = y;копии значение y на x. То есть x теперь имеет значение, которое было присвоено y. Дальнейшие изменения на y, после присвоения x, не изменят значение x. Если вы хотитеx Чтобы навсегда ссылаться на значение y, вам нужно использовать ссылку, обозначенную амперсандом, как это int & x = y;.

В вашем случае int newDigits (int x) принимает x как копию того, что вы указали при звонке newDigits. Ничто из того, что вы делаете в пределах newDigits, может повлиять на исходное значение, данное newDigits.

Использование const просто означает, что вы не можете изменить значение. const int x помешает вам изменить текущее значение x. Здесь нет необходимости сохранять значение, данное newDigits, так как мы уже не можем его модифицировать в этом случае. Если xбыло a reference (int & x), то добавление const действительно помешало бы вам случайно изменить исходное значение, которое было присвоено newDigits.

Обратите внимание, что в вашем примере x никогда не изменяется вообще.

+0

Обратитесь к http://stackoverflow.com/ Вопросы/42144329/c-verify-creditcard-via-luhn-formula-loop-sumtoken-error для лучшего понимания –

+0

@KayzelMoo Если что-то я неправильно понял, укажите его.Я рассмотрел упомянутый вопрос, но я не вижу, какую дополнительную информацию я ожидаю получить от него. –

+0

secondDigit = x% 1000/100 * 2; \t 4thDigit = x% 10 * 2; Передает ли значение x перед тем, как оно переместится, чтобы вычислить четвертый бит? –