2015-09-20 1 views
0

Сначала я хочу поделиться с вами this репозиторий на Github, где упоминается несколько хороших практик в текущее время программирования в C. Здесь упоминается, что:Никогда не изменять состояние в выражении

Никогда не изменить состояние в выражении [...]

В этой связи я хотел бы знать, в чем разница.

trie_add(*child, ++word);  // Bad 

и

trie_add(*child, word + 1); // Good 

Может кто-то объяснить это более подробно?

+3

Первого изменяет значение 'слово' в качестве стороны эффект. Является ли это * хорошим * или * плохим * основанным на мнениях. –

+1

Распечатайте значение 'word' после обоих утверждений, и вы увидите разницу. – Kninnug

+0

Итак, [компактная реализация 'strcpy'] (https://en.wikibooks.org/wiki/C_Programming/C_Reference/string.h/strcpy#Usage_and_implementation) плоха? :-P –

ответ

2

В Genral зрения, в случае, если использовать

trie_add(*child, ++word); 

word оказывает побочный эффект в виде преинкремента. Во многих случаях использование этого подхода вызывает undefined behavior из-за отсутствия sequence point.

Однако вызов

trie_add(*child, word + 1); 

не имеет побочный эффект на word.

FWIW, оба вызова проходят одинаково значение вызываемой функции.

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

+0

Спасибо за ваш ответ, теперь я понимаю – Kevin

+3

Я не вижу необходимости в точке последовательности в выражении, так как я не вижу необходимости в 'foo (a ++, b ++, C++, d ++);' – pmg

+0

@pmg сэр, не здесь, но если первый _approach_ используется более одного раза для одной переменной, это вызовет проблему. Во всяком случае, второй подход (например, '+ 1',' + 2') будет безопасным. –

0

Никогда не изменяет состояние в выражении

Это слишком строги. Как уже было сказано, в trie_add(*child, ++word); ничего плохого нет.

Но нужно проявлять осторожность, так как в trie_add2(*child, ++word, ++word); порядок оценки не является фиксированным, так что компилятор может свободно произвести эквивалент либо trie_add2(*child, word+1, word+2); или trie_add2(*child, word+2, word+1);