задержка значения переменной cout - PullRequest
2 голосов
/ 17 апреля 2019
int * getInt2(int a[]) {
    (*a) *= 2;
    return a;
}

int main(int argc,char *argv[])
{
    int intInit = 1;
    int * (*intPtr)(int *) = getInt2;
    cout << intInit++ << ":" << intInit << endl;
    cout << intPtr(&intInit) << ":" << intInit<<endl;
    cout << intInit << endl;
    cout << *intPtr(&intInit) << endl;
    cout << (*intPtr)(&intInit) << ":" << *(*intPtr)(&intInit) << endl;
    cout << intInit << endl;
}

реальный результат при запуске:

1:2
012FFABC:2
4
8
012FFABC:16
32

но я ожидаю, что он будет:

1:2
012FFABC:4
4
8
012FFABC:32
32

что я неправильно понял? Есть ли причина, почему он задерживается?спасибо за любую подсказку.

Я вижу, что кто-то думает, что поведение выражения не определено в c ++, и фокус всегда находится в операции автоинкремента, поэтому я добавляю пример:

int addTarget(int &n) {
    n += 1;
    return n;
}
int multiplyTarget(int &n) {
    n *= 2;
    return n;
}

int main(int argc,char *argv[])
{
    int intTest = 1;
    cout << multiplyTarget(intTest) << ":" << addTarget(intTest) << endl;
    cout << addTarget(intTest) << ":" << multiplyTarget(intTest) << endl;
}

над кодомрезультат:

4:2
9:8

Я вижу, что кто-то говорит, что выходная последовательность слева направо, а последовательность операций справа налево. Это может объяснить большинство ситуаций. Но я думаю, что первый вывод первого примера долженбыть 1: 1 не 1: 2 в соответствии с этой теорией. Я действительно хочу знать теорию.

Ответы [ 2 ]

3 голосов
/ 17 апреля 2019

До C ++ 17,

std::cout << intInit++ << ":" << intInit << endl;

увеличение intInit не должно происходить до следующего <<

, так что оба

std::cout << intInit << ":" << intInit << endl; intInit++;

или

std::cout << intInit;
intInit++;
std::cout << ":" << intInit << endl; intInit++;

действительны.

В C ++ 17 полный побочный эффект intInit++ должен произойти до std::cout << ":" << intInit << endl.

0 голосов
/ 19 апреля 2019

Это как функция синтаксического анализа входных параметров, вычисления справа налево, затем вставка значения в стек и отображение значения. Например:

int add(int a, int b, int c)
{
    return a + b + c;
}
auto i = 0;
add(i++, i, ++i);

мы получаем 5 в конце. Но если он сначала вычисляется, а затем помещает значение в стек, я все еще думаю, что первый ввод должен быть 1: 1, а не 1: 2. Но когда я изменяю стандарт компилятора на c ++ 17. результат кода выше 3. Я изменяю исходный код на:

    int intInit = 1;
    int * (*intPtr)(int *) = getInt2;
    cout << intInit++ << ":" << intInit << endl;
    cout << *intPtr(&intInit) << ":" << intInit<<endl;
    cout << intInit << endl;
    cout << *intPtr(&intInit) << endl;
    //(* ptr)函数书写
    cout << *(*intPtr)(&intInit) << ":" << *(*intPtr)(&intInit) << endl;
    cout << intInit << endl;

и вывод нормальный:

1:2
4:4
4
8
16:32
32

Это действительно связано со стандартом c ++, и компилятор c ++ 14 может не очень хорошо разбирать параметры.

...