Цикл for будет иметь ветку, даже если вы удалите это
if(val > threshold)
break;
Он будет сгенерирован компилятором, чтобы увидеть, следует ли продолжать цикл или нет. Хотя мы можем удалить дополнительную ветку, созданную внутри цикла for.
k += static_cast<int>(val > threshold) * 500;
Это увеличит k
на 500, если val > threshold
, и, следовательно, выйдет из цикла в той же ветви, которая проверяет, достигло ли k
нужного значения, без дополнительной ветви. В зависимости от того, насколько тяжелы вычисления внутри цикла, это может не иметь значения.