Один из a
и b
должен быть указателем, а другой должен быть любым целым числом типа. Доказательство следует.
Поскольку a[b]
идентична (*((a)+(b)))
на C 2011 (n1570) 6.5.2.1 2, a
и b
могут быть любые типы, такие, что определено последнее выражение.
В соответствии с 6.5.3.2 2 операнд унарного оператора *
должен иметь тип указателя. Следовательно, результат (a)+(b)
должен иметь тип указателя.
По 6.5.6, двоичный оператор +
принимает различные комбинации типов, но единственным, который дает тип указателя, является комбинация указателя и целого числа, как описано в 6.5.6. 8.
Согласно 6.5.6 8, целое число может быть добавлено к указателю, а результат имеет тип операнда указателя. В пункте 6.5.6 не делается различий относительно порядка операндов +
, поэтому они могут быть в любом порядке. Таким образом, любой из a
и b
может быть указателем, а другой - целым числом.
+1 для демонстрации. – Xaqq
Я всегда предпочитаю 'int' inside' [] ', потому что его самый популярный, также' int [array] 'не так понятен, как base/index. Второй 'array [++ i]' мне понятен, но '++ i [array]' not (infect оба не одинаковы). Более того, 'i [++ array]' является ошибкой для имени массива. –
Это только если вы можете предположить, что ваши массивы не огромны, что почти всегда верно (за исключением случаев, когда это не так); см. http://ewontfix.com/9/ :) – loreb