【问题标题】:Are loops with and without parenthesis handled differently in C?带括号和不带括号的循环在 C 中的处理方式不同吗?
【发布时间】:2010-12-19 10:19:09
【问题描述】:

我正在调试器中单步执行一些 C/CUDA 代码,例如:

for(uint i = threadIdx.x; i < 8379; i+=256) 
    sum += d_PartialHistograms[blockIdx.x + i * HISTOGRAM64_BIN_COUNT];

我完全糊涂了,因为调试器一步步通过了它,尽管输出是正确的。我意识到,当我像下面的 sn-p 那样在循环周围放置大括号时,它在调试器中的行为符合预期。

for(uint i = threadIdx.x; i < 8379; i+=256) {
    sum += d_PartialHistograms[blockIdx.x + i * HISTOGRAM64_BIN_COUNT];
}

对于在 C 或调试器中以不同方式处理的循环,或者它可能是 CUDA 特有的,因此是无括号的。

谢谢

【问题讨论】:

  • 我只是好奇……这两者的速度会有什么区别吗?

标签: c debugging loops for-loop cuda


【解决方案1】:

调试器一次执行一条语句。 看看这个:

int sum = 0;                            /* one assignment statement */
for (int k = 0; k < 10; k++) sum += k;  /* one for statement */

和这个比较

int sum = 0;                            /* one assignment statement */
for (int k = 0; k < 10; k++)
{                                       /* for statement with the body
                                           in a block of statements */
    sum += k;                           /* assignment statement */
}

在上面的第一个示例中,sum += kfor 语句的组成部分;在第二个例子中,它本身就是一个完整的语句。

【讨论】:

    【解决方案2】:

    在“for”之后的单个语句或其中包含一个语句的块之间没有任何执行差异。不过,看看您的代码,您是否意识到 i 实际上并没有增加?也许您的意思是输入 i+=256。

    就调试器而言,括号构成要“移入”的其他内容,而单行就是这样,单行(就像没有块的 if 语句)。

    【讨论】:

    • 抱歉是 i+=256 ,我只是在这里复制代码时出错了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-29
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 2021-10-14
    • 2021-01-11
    相关资源
    最近更新 更多