【发布时间】:2020-04-10 16:31:17
【问题描述】:
这个 sn-p 工作得很好。
for (int i = 0; i < 1; i++) // for some other purpose
{
// some other code
double** angle = new double* [10]; // for a 2D matrix
for (int j = 0; j < 10; j++)
{
angle[j] = new double [3];
if (j == 0)
angle[j][0] = 2; // focused on the first column for now
else
angle[j][0] = angle[j-1][0]+3;
std::cout << angle[j][0] << std::endl;
}
for (int i = 0; i < 10; i++)
delete[] angle[i];
delete[] angle;
}
我试图不在循环内使用条件语句。如果我用以下行替换它,代码将停止工作。请帮助我理解它。
angle[j][0] = (j == 0) * 2 + (j != 0) * (angle[j-1][0] + 3);
在 Ubuntu 16.04 LTS 上使用 g++ -std=c++11 -o out main.cpp; ./out
【问题讨论】:
-
为了什么目的你想使用条件语句作废?可读性?表现?使用 delete[] 格式化循环也具有误导性。
-
@KonstantinStupnik:感谢您指出这一点。我正在听一位教授的讲座,他有点建议。拥有非 IT 背景,我没有太多时间来验证或交叉检查他的陈述。如果您修复解除分配,我将不胜感激。请分享您的意见。
-
虽然编译器可能会进行优化,但并不严格要求 - 数学运算本质上不是短路的。因此,当
j为零时,没有什么可以阻止编译器在修改后的代码中评估angle[j-1][0] + 3(实际上,可以在评估表达式j==0或j != 0之前评估它)——这会产生未定义的行为. -
至少 unindent 'delete[] angle;'行,我建议在循环体周围加上大括号,也可以删除。这几乎是一个宗教问题,是否在单个语句主体周围放置大括号,但从长远来看,IMO 最好始终使用它们。
标签: c++ for-loop conditional-operator