где rvalue хранится в c?

Хотя вы можете «заменить» кнопку изображением, используя следующий CSS ...

.className {
   background: url(http://sstatic.net/so/img/logo.png) no-repeat 0 0;
   border: 0;
   height: 61px;
   width: 250px
}

... лучшее, что можно сделать здесь, это использовать элемент управления ImageButton, потому что он позволит вам использовать альтернативный текст (для доступности).

8
задан Amro 3 November 2009 в 04:51
поделиться

7 ответов

В новом руководстве по Visual Quickstart Guide для iPhone SDK 3 от PeachPit для всех примеров используется исключительно код, а не IB.

http://mark.aufflick.com/bookshelf#0321669533

Заявление об ограничении ответственности: Автор этой книги посещает Сиднейский CocoaHeads, который я организовываю :)

а = 17 * х; // x some run time var, значение r тоже будет "сохранено" (или, скорее, материализовано) в виде последовательности инструкций в двоичном файле программы. Отличие от простого "mov dest, imm" выше, состоит в том, что потребуется несколько инструкций для загрузки переменной x в аккумулятор, умножения на 17 и сохранения результата по адресу, где находится переменная a. Возможно, что компилятор может «авторизовать себя» ;-) для использования стека для получения промежуточного результата и т.д., но это будет
умножьте на 17 и сохраните результат по адресу, где находится переменная a. Возможно, что компилятор может «авторизовать себя» ;-) для использования стека для получения промежуточного результата и т.д., но это будет
умножьте на 17 и сохраните результат по адресу, где находится переменная a. Возможно, что компилятор может «авторизовать себя» ;-) для использования стека для получения промежуточного результата и т. Д., Но это будет
а) полностью зависит от компилятора
б) транзиантный
c) и обычно включает только часть r-значения
поэтому можно с уверенностью сказать, что r-значение - это концепция времени компиляции, которая инкапсулируется в частях программы (не в данных) и не сохраняется нигде, кроме двоичного файла программы.

В ответ на paxdiablo : объяснение, предложенное выше, действительно ограничивает возможности, потому что стандарт c фактически не диктует что-либо подобное. Тем не менее, большая часть любого r-значения в конечном итоге материализуется, по крайней мере частично, некоторыми инструкциями, которые настраивают вещи так, чтобы правильное значение, вычисленное (во время выполнения) или немедленное, было адресовано должным образом.

4
ответ дан 5 December 2019 в 15:24
поделиться

Термины «lvalue» и «rvalue» используются для разделения мира выражений пополам. То есть (10 + 5-3) - это выражение, которое оказывается r-значением (потому что вы не можете применить к нему оператор & - в C ++ правила более сложны). Во время выполнения нет выражений, lvalue или rvalue. В частности, они нигде не хранятся.

Вам было интересно, где было сохранено значение 12, но значение 12 не является ни lvalue, ни rvalue (в отличие от выражения 12 , которое было бы rvalue, но 12 не отображается в вашей программе).

0
ответ дан 5 December 2019 в 15:24
поделиться

Константы, вероятно, упрощаются во время компиляции, поэтому ваш вопрос, поставленный буквально, может не помочь. Но что-то вроде, скажем, i - j + k , которое нужно вычислять во время выполнения из некоторых переменных, может быть «сохранено» где угодно компилятору, в зависимости от архитектуры процессора: компилятор обычно пытается чтобы сделать все возможное, чтобы использовать регистры, например

 LOAD AX, i
 SUB AX, j
 ADD AX, k

, чтобы вычислить такое выражение, «сохраняя» его в регистре накопителя AX, перед назначением его некоторой ячейке памяти с помощью STORE AX, dest или тому подобное. Я был бы очень удивлен, если бы современный оптимизирующий компилятор на даже полуприличной архитектуре ЦП (да, включая x86! -) потребовал бы сбросить регистры в память для любого достаточно простого выражения!

5
ответ дан 5 December 2019 в 15:24
поделиться

Это зависит от компилятора. Обычно значение (12) вычисляется компилятором. Затем он сохраняется в коде, как правило, как часть инструкции немедленной сборки load / move.

1
ответ дан 5 December 2019 в 15:24
поделиться

Где он хранится, на самом деле полностью зависит от компилятора. Стандарт не требует такого поведения.

Типичное место можно увидеть, фактически скомпилировав код и посмотрев на вывод ассемблера:

int main (int argc, char *argv[]) {
    int a;
    a = 10 + 5 - 3;
    return 0;
}

который производит:

        .file   "qq.c"
        .def    ___main;
            .scl    2;
            .type   32;
        .endef
        .text
.globl _main
        .def    _main;
            .scl    2;
            .type   32;
        .endef
_main:
        pushl   %ebp
        movl    %esp, %ebp
        subl    $8, %esp
        andl    $-16, %esp
        movl    $0, %eax
        addl    $15, %eax
        addl    $15, %eax
        shrl    $4, %eax
        sall    $4, %eax
        movl    %eax, -8(%ebp)
        movl    -8(%ebp), %eax
        call    __alloca
        call    ___main
        movl    $12, -4(%ebp)         ;*****
        movl    $0, %eax
        leave
        ret

Соответствующий бит помечен ; ***** , и вы можете видеть, что значение создается компилятором и просто вставляется непосредственно в инструкцию типа mov .

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

1
ответ дан 5 December 2019 в 15:24
поделиться
  • Результат вычисления в правой части (справа) вычисляется компилятором на этапе, который называется «постоянное распространение».
  • Затем он сохраняется как операнд инструкции сборки, перемещающей значение в a

Вот разборка из MSVC:

  int a;
  a = 10 + 5 - 3;

0041338E  mov         dword ptr [a],0Ch 
0
ответ дан 5 December 2019 в 15:24
поделиться

Ваш вопрос основан на неверной предпосылке.

Определяющим свойством lvalue в C является то, что у него есть место в хранилище , то есть хранится . Это то, что отличает lvalue от rvalue . Rvalue нигде не хранится. Вот что делает его rvalue. Если бы это было сохранено,

0
ответ дан 5 December 2019 в 15:24
поделиться
Другие вопросы по тегам:

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