Изменяя значения переменных в методах, Java [дубликат]

Вот непроверенный код для проверки соответствия строки запрошенной спецификации.

#include <ctype.h>


/*  IsFloatNumeral returns true (1) if the string pointed to by p contains a
    valid numeral and false (0) otherwise.  A valid numeral:

        Starts with optional white space.
        Has an optional hyphen as a minus sign.
        Contains either digits, a period followed by digits, or both.
        Ends with optional white space.

    Notes:

        It is unusual not to accept "3." for a float literal, but this was
        specified in a comment, so the code here is written for that.

        The question does not state that leading or trailing white space
        should be accepted (and ignored), but that is included here.  To
        exclude such white space, simply delete the relevant lines.
*/
_Bool IsFloatNumeral(const char *p)
{
    _Bool ThereAreInitialDigits = 0;
    _Bool ThereIsAPeriod = 0;

    //  Skip initial spaces.  (Not specified in question; removed if undesired.)
    while (isspace(*p))
        ++p;

    //  Allow an initial hyphen as a minus sign.
    if (*p == '-')
        ++p;

    //  Allow initial digits.
    if (isdigit(*p))
    {
        ThereAreInitialDigits = 1;
        do
            ++p;
        while (isdigit(*p));
    }

    //  Allow a period followed by digits.  Require at least one digit to follow the period.
    if (*p == '.')
    {
        ++p;
        if (!isdigit(*p))
            return 0;
        ThereIsAPeriod = 1;
        do
            ++p;
        while (isdigit(*p));
    }

    /*  If we did not see either digits or a period followed by digits,
        reject the string (return 0).
    */
    if (!ThereAreInitialDigits && !ThereIsAPeriod)
        return 0;

    //  Skip trailing spaces.  (Not specified in question; removed if undesired.)
    while (isspace(*p))
        ++p;

    /*  If we are now at the end of the string (the null terminating
        character), accept the string (return 1).  Otherwise, reject it (return
        0).
    */
    return *p == 0;
}
14
задан Mat 1 May 2012 в 14:32
поделиться

3 ответа

Взгляд на статью Jon Skeet о Передаче параметров в Java, который объясняет это.

Короче говоря (смотрят на его сайт для больше в течение объяснения):

Массивы являются ссылочными типами. При передаче ссылки, которая указывает на массив, значение ссылки скопировано и присвоено параметру функции. Таким образом, параметр укажет на тот же массив как аргумент, который был передан. Таким образом изменения, которые Вы вносите в массив через параметр Вашей функции, будут видимы в функции вызова. Изменение самого параметра (b), например, путем установки его в NULL, однако, не будет замечено функцией вызова, так как параметр (b) является просто копией аргумента переданный (тигр).

Целые числа являются так называемыми типами примитивов. Передача целого числа копирует свое значение и присваивает его параметру также. Но то значение не является ссылкой на фактические данные, но является самими данными. Таким образом, изменения в параметре в функции будут влиять на параметр (a), но не аргумент передал в звонящей функции (птица).

18
ответ дан 1 December 2019 в 10:19
поделиться

В основном объекты (как массивы) передаются в методы "ссылкой". Таким образом, при изменении объекта он изменяет тот же объект, который был передан в метод.

Примитивы (как интервал) "передаются значением", таким образом, переменная, которой Вы присваиваете значение в не то же как международная переменная, которая была передана в.

Я надеюсь, что это помогает...

4
ответ дан 1 December 2019 в 10:19
поделиться

Поэтому, когда Вы объявляете

 public static void funk(int a, int[] b) 

Объем переменной только того метода. Затем при изменении значения Вы изменяете только значение той переменной в том методе.

О b. Это - новая ссылка на объект на тот же массив, созданный в основном, вот почему кажется, что значение действительно изменяет (что изменяется, объект массива внизу),

Но попробуйте это:

public static void funk(int a, int[] b) { 
    // create a new reference for b
    int[] c = new int[b.length];
    c[0] = b[0];
    b = c;

    // The same.
    b[0] = b[0] * 2; 
    a = b[0] + 5;
} 

Когда Вы сделаете это, Вы будете, значение тигра не изменило ни одного (только содержание нового массива c созданный в фанке)

Можно моделировать передачу касательно использования обертки. См. это сообщение.

Хотя у меня нет комментариев об этом

РЕДАКТИРОВАНИЕ Только для забавы:

Я изменил Ваш код для использования обертки, отправленной выше.

Это выглядит довольно странным, но похоже, это работает.

// By ref simulated.
public class Test {

    public static void funk(_<Integer> a, int[] b) { 
        b[0] = b[0] * 2; 
        a.s(  b[0] + 5 ) ;
    } 

    public static void main(String[] args) {
        _<Integer> bird = new _<Integer>(10);
        int[] tiger = {7};

        Test.funk( bird , tiger );

        System.out.println("bird = " + bird );
        System.out.println("tiger = " + tiger[0] );

    }

}

Печать

bird = 19
tiger = 14

:-S

4
ответ дан 1 December 2019 в 10:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: