2010-02-16 92 views
2

给定这个循环,为什么最后有一个分号?不理解这个语法

for(s = string; *s == ' '; s++) 
    ; 

感谢

编辑*那么有没有可能,因此开始于一个字符串,并检查是否有空间的末端,降低直到它找到一个charachter扭转这一程序?

+0

更改为使用++ s - 它有可能生成更好的代码。 – 2010-02-16 09:42:26

+4

为什么会使代码更好?在这个例子中它将完全一样。 – Marius 2010-02-16 09:44:12

+0

如果你有一个具有正确优化的编译器(大部分都是这样,因此“潜在”),情况就是这样。除非需要后增量,否则使用预增量是一种很好的做法 - 优化通常不适用于非内置类型。 – 2010-02-16 09:53:37

回答

0

它导致循环无能为力。所发生的只是指针是先进的。

3

分号表示循环内没有任何内容。在你的代码中,循环只是循环直到字符串中的字符不是空格。也就是说,在该行之后,s指向字符串中不是空格的第一个字符。

3

分号在循环中产生一个空语句。该循环搜索string中的第一个非空白char

6

它是一个空语句,这是一个无操作在C.这是因为如果你曾说过:

for(s = string; *s == ' '; s++) 
{ 
    // do nothing 
} 

您可以使用此,当一切都可以在for(...)结构本身来完成 - 的C语法要求有一个受控制的陈述,但没有什么可做的。

+0

我不明白为什么这个问题在6年后没有被接受为答案 – 2016-10-13 15:44:53

0

必须有一个语句或块作为for循环的“主体”。这是循环中每次执行的内容(只要s仍指向一个空格)。

自身分号是声明 - 也就是说,什么也没有发生在循环体,只是s++for环线。

1

因为在C(和其他)的语法是: 为(INIT;条件;步骤) 体

凡体可以是闭合的,但身体还可以(的代码在{}块)与...一起;

1

我想指出的是,循环可以这样写,使之更明确到底是怎么回事,增加可读性:

for(s = string; *s == ' ';) 
    s++; 

或使用while循环:

s = string; 
while(*s == ' ') 
    s++; 

但我认为空体的第一种方法更多的是“c-idiomatic”(更难以阅读)。

+0

可读性的提高仅在您的眼中, 恕我直言。原始形式是惯用语的事实使得有经验的C程序员可以轻松阅读。 – 2010-02-16 09:59:04

+0

好吧,我们正在谈论的*唯一的原因是因为OP有理解它的问题...... – 2010-02-16 10:32:21