Следующий код нарушает строгий псевдоним?

\r\n - это возврат каретки, символ новой строки и два пробела в начале вашей даты. Попробуйте использовать trim ..

$('#endDate').val($.trim(value));
1
задан Paul Ogilvie 19 January 2019 в 16:12
поделиться

3 ответа

Строгие правила псевдонимов не заботятся о промежуточных приведениях. Они заботятся только о типе указателя, который в конечном итоге используется для доступа к объекту, и об исходном типе самого объекта (технически это «эффективный тип», но это сейчас не важно).

В вашем примере кода вы берете адрес int. Результат имеет тип int *. Вы приводите этот указатель к char *, вы снова приводите его к int *, и только тогда вы разыменовываете его. Тип указателя, используемого в доступе, - int *, а тип объекта, на который указывает объект, - int, поэтому строгие правила наложения имен не имеют проблем.

Вы правы, что строгие правила псевдонимов асимметричны по отношению к char, но это имеет значение только тогда, когда либо тип самого объекта равен char, либо тип указателя, используемого при доступе, равен char :

char x[sizeof(int)] = { 0 };
*(int *)x = 1;  // undefined behavior

int y = 1234;
*(char *)y = 0; // valid; value of y becomes unspecified

Теоретически, приведение между двумя типами указателей может потерять информацию, но не при приведении из другого типа к char * и обратно. Кроме того, это относится только к компьютерам, с которыми вы вряд ли столкнетесь в наши дни. Я не могу вспомнить пример.

0
ответ дан zwol 19 January 2019 в 16:12
поделиться

Нет, это не нарушение.

, потому что мы разыграли char * в int *

Вы пропустили ту часть, которую char *, которую вы упомянули, на самом деле была [113 ]. Таким образом, наконец, доступ к типу int осуществляется через указатель на int - это совершенно верно.

0
ответ дан Sourav Ghosh 19 January 2019 в 16:12
поделиться

Этот код действителен. Разрешается выполнять преобразование между двумя типами указателей объектов и обратно при условии, что нет проблем с выравниванием, а преобразование в char * явно разрешает доступ к представлению объектов (т. Е. Считывает отдельные байты).

Раздел 6.3.2.3p7 стандарта C гласит:

Указатель на тип объекта может быть преобразован в указатель на другой тип объекта. Если результирующий указатель неправильно выровнен для ссылочного типа, поведение не определено. В противном случае при обратном преобразовании результат сравнивается равным исходному указателю. Когда указатель на объект преобразуется в указатель на тип символа, результат указывает на младший адресуемый байт объекта. Последовательные приращения результата, вплоть до размера объекта, дают указатели на оставшиеся байты объекта.

Поскольку вы переходите от int * к char *, а затем обратно к int *, здесь нет строгих нарушений псевдонимов.

0
ответ дан dbush 19 January 2019 в 16:12
поделиться
Другие вопросы по тегам:

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