C имеет концепцию неопределенного поведения, то есть некоторые языковые конструкции синтаксически верны, но вы не можете предсказать поведение при запуске кода.
Насколько мне известно, стандарт не явно , почему существует понятие неопределенного поведения. На мой взгляд, это просто потому, что разработчики языка хотели, чтобы в семантике была некоторая свобода действий, вместо того, чтобы требовать, чтобы все реализации обрабатывали целочисленное переполнение точно таким же образом, что, скорее всего, наложило бы серьезные затраты на производительность, они просто оставили поведение undefined, так что, если вы пишете код, который вызывает переполнение целых чисел, все может случиться.
Итак, имея в виду, почему эти «проблемы»? Язык ясно говорит, что определенные вещи приводят к неопределенному поведению . Нет проблем, нет «необходимости». Если неопределенное поведение изменяется, когда объявлена одна из вовлеченных переменных volatile
, это ничего не доказывает или не изменяет. Это undefined ; вы не можете рассуждать о поведении.
Ваш наиболее интересный пример, один с
u = (u++);
является примером неопределенного поведения в текстовой книге (см. запись Википедии в точек последовательности ).
Эквивалент layout_column
и layout_row
, как и для всех параметров layout_...
, можно найти как параметр подкласса LayoutParams
.
В этом случае это GridLayout.LayoutParams
, и мы используем его так (для сетки 2x2 с подвью в последней строке и столбце, центрированной внутри ячейки):
gridLayout.setColumnCount(2);
gridLayout.setRowCount(2);
gridLayout.addView(subview, new GridLayout.LayoutParams(
GridLayout.spec(1, GridLayout.CENTER),
GridLayout.spec(1, GridLayout.CENTER)));
Вы должны сделать что-то вроде этого:
GridLayout gridLayout = new GridLayout(this);
gridLayout.setColumnCount(2);
gridLayout.setRowCount(4);