Запятая как разделитель в инициализации переменной (не как оператор) - PullRequest
0 голосов
/ 15 января 2019

Это кажется таким простым вопросом, но то, что я не изучал целую вечность в своем собственном стиле ... При инициализации переменных, разделенных запятой, я предположил, что небезопасная практика:

unsigned int n = foo.size, nxn = n * n;

Так как я действительно никогда не использую оператор запятой как таковой для синтаксического сахара и т. Д .; скорее, чтобы указать, что два выражения независимы - как своего рода неявный комментарий к «мелкозернистому параллелизму» (или независимости выражения), который часто делает код немного более кратким, например,

if (<some condition>)
    a = true, b = value;

вместо того, чтобы требовать {} scope для выражений, разделенных точкой с запятой.

Но мой вопрос действительно в том, чтобы пересмотреть случай инициализации переменной. Неправильно ли я предположил, что на nxn нельзя положиться при инициализации, как ожидалось? Или я все это время неправильно истолковывал?

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Per [dcl.decl] / 3

Каждый init-декларатор в объявлении анализируется отдельно, как если бы он был в объявлениисам.[...]

мы получаем, что

unsigned int n = foo.size, nxn = n * n;

совпадает с

unsigned int n = foo.size;
unsigned int nxn = n * n;

Есть примечание с исключениями для других правил, таких как auto или если имя затеняет тип, но оно не применяется в этом случае.


Будьте очень осторожны с указателями, если вы поместите несколько переменных в одну строку

int * foo, bar;

не дает вам два указателя.Вместо этого foo - это указатель, а bar - это int.Вам понадобится

int * foo, * bar;

, чтобы получить два указателя.По этой причине я предпочел бы использовать

int * foo;
int * bar;

и платить дополнительные ключи за безопасность.

0 голосов
/ 15 января 2019

nxn будет правильно инициализирован, поскольку n был определен и инициализирован в точке, где определено nxn.

Однако для ясности было бы лучше поместить переменные в отдельныелиний.Это позволяет избежать двусмысленности, делая ваши намерения более ясными для любого, кто читает ваш код.

...