C/C++中else语句的多行格式设置(不带大括号)

C/C++中else语句的多行格式设置(不带大括号),c++,if-statement,C++,If Statement,我改写了一些C++代码,我有以下的 if (ConfidenceBias.value > 0) *normalInfo = tree.setDataField(NormalSigs(), *samples, *sampleData, density, pointWeightSum, ConversionAndBiasFunction); else *normalInfo = tree.setDataField(NormalSigs(), *samples, *sampleData, den

我改写了一些C++代码,我有以下的

if (ConfidenceBias.value > 0) *normalInfo = tree.setDataField(NormalSigs(), *samples, *sampleData, density, pointWeightSum, ConversionAndBiasFunction);
else *normalInfo = tree.setDataField(NormalSigs(), *samples, *sampleData, density, pointWeightSum, ConversionFunction); ThreadPool::Parallel_for(0, normalInfo->size(), [&](unsigned int, size_t i) { (*normalInfo)[i] *= (Real)-1.; });
我假设这相当于

if (ConfidenceBias.value > 0) 
{
    *normalInfo = tree.setDataField(NormalSigs(), *samples, *sampleData, density, pointWeightSum, ConversionAndBiasFunction);
}
else 
{
    *normalInfo = tree.setDataField(NormalSigs(), *samples, *sampleData, density, pointWeightSum, ConversionFunction);  
}

ThreadPool::Parallel_for(0, normalInfo->size(), [&](unsigned int, size_t i) { (*normalInfo)[i] *= (Real)-1.; });
但有一个小问题是,编译器将原文解释为

if (ConfidenceBias.value > 0) 
{
    *normalInfo = tree.setDataField(NormalSigs(), *samples, *sampleData, density, pointWeightSum, ConversionAndBiasFunction);
}
else 
{
    *normalInfo = tree.setDataField(NormalSigs(), *samples, *sampleData, density, pointWeightSum, ConversionFunction);  
    ThreadPool::Parallel_for(0, normalInfo->size(), [&](unsigned int, size_t i) { (*normalInfo)[i] *= (Real)-1.; });
}

我在任何地方都找不到VSVC编译器所做工作的参考。是哪一个?

请确认您对代码的假设是正确的

对于大多数语言,我只知道一个语句或复合语句,例如大括号将在条件下执行

在这种情况下,代码行真的很奇怪地隐藏了起来,我认为这是一种代码味道,因为它使代码难以阅读、理解和调试

< >编辑,因为我喜欢完整的答案:实际上,你不需要知道VS C++编译器在这里做什么,因为这是定义的。看看这个

请参阅MSDN文档以了解这一点:

控制条件分支。if块中的语句是 仅当if表达式的计算结果为非零值或 符合事实的如果表达式的值为非零,则语句1和任何其他 执行块中的语句,如果存在else块, 被跳过。如果表达式的值为零,则If块为 跳过并执行else块(如果存在)。表达

要理解这一点,请检查以下定义:

表达式语句导致对表达式求值。禁止转让 控制或迭代的结果是表达式的结果 声明

expression语句的语法只是语法

[expression ] ;
这里是

复合语句由0个或多个包含在 花括号{}。复合语句可以在任何位置使用 预计会有一份声明。复合语句通常称为 阻碍。语法

{ [ statement-list ] }

结论:你的假设是正确的,你的恐惧是没有根据的:

如果你对代码的假设是正确的

对于大多数语言,我只知道一个语句或复合语句,例如大括号将在条件下执行

在这种情况下,代码行真的很奇怪地隐藏了起来,我认为这是一种代码味道,因为它使代码难以阅读、理解和调试

< >编辑,因为我喜欢完整的答案:实际上,你不需要知道VS C++编译器在这里做什么,因为这是定义的。看看这个

请参阅MSDN文档以了解这一点:

控制条件分支。if块中的语句是 仅当if表达式的计算结果为非零值或 符合事实的如果表达式的值为非零,则语句1和任何其他 执行块中的语句,如果存在else块, 被跳过。如果表达式的值为零,则If块为 跳过并执行else块(如果存在)。表达

要理解这一点,请检查以下定义:

表达式语句导致对表达式求值。禁止转让 控制或迭代的结果是表达式的结果 声明

expression语句的语法只是语法

[expression ] ;
这里是

复合语句由0个或多个包含在 花括号{}。复合语句可以在任何位置使用 预计会有一份声明。复合语句通常称为 阻碍。语法

{ [ statement-list ] }

结论:你的假设是正确的,你的担心是没有根据的:

有一点证据表明,编译器正在将原文解释为它为什么应该这样做的任何理由?重写一些C代码这段代码肯定不是C代码。不,不是真的,我只是找不到一个关于编译器如何在没有大括号的else之后处理多个语句的参考,我觉得奇怪为什么有人会这样写,而没有它的意义……C风格的代码。@MoonKnight您的第一个解释是正确的,但代码的格式肯定很糟糕。似乎作者可能有意让代码等同于您的第二次解释。在C和C++中的控制流块中,使用非常普通的样式指南来跳过单个语句上的括号。这没有什么C风格。但至少这些语句应该适当缩进,以显示它们在控制流中的位置。有一点需要注意的是,编译器正在将原始语句解释为它为什么应该这样做的任何推理?重写一些C代码这段代码肯定不是C代码。不,不是真的,我只是找不到一个关于编译器如何在没有大括号的else之后处理多个语句的参考,我觉得奇怪为什么有人会这样写,而没有它的意义……C风格的代码。@MoonKnight您的第一个解释是正确的,但代码的格式肯定很糟糕。似乎作者可能有意将代码等效于您的s
第二种解释。在C和C++中的控制流块中,使用非常普通的样式指南来跳过单个语句上的括号。这没有什么C风格。但至少语句应该适当缩进,以显示它们在控制流中的位置。难以置信的回答,非常感谢您在这里的时间,表达式语句只是一种可能的语句,它可以作为单个语句而不是带括号的复合语句。您可以在C++标准中找到权威语法。请参阅:After else后面是一个语句,在中定义为单个语句列表中的一个语句或复合语句,根据是用大括号括起来的一系列语句。难以置信的答案,非常感谢您在这里花时间,表达式语句只是一种可能的语句,它可以作为单个语句而不是带括号的复合语句。您可以在C++标准中找到权威语法。请参阅:After-else后面跟一条语句,在中,它被定义为单个语句列表中的一条语句或复合语句,根据,复合语句是用大括号括起来的语句序列。