- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我无法理解以下 for 循环。请帮我。谢谢你的时间。我无法理解 for 循环如何在第一次迭代中变为 true。如果 s[0] = "d",那么 "d"将如何被视为 "true"。
#include <stdio.h>
int main()
{
char s[] = "d";
int i;
for(i = 0; s[i]; i++)
printf("%c %c %c %c",s[ i ], *(s+i), *(i+s), i[s]);
return 0;
}
output : dddd
最佳答案
根据C标准(6.5.2.1数组下标)
2 A postfix expression followed by an expression in square brackets [] is a subscripted designation of an element of an array object. The definition of the subscript operator [] is that E1[E2] is identical to (*((E1)+(E2))). Because of the conversion rules that apply to the binary + operator, if E1 is an array object (equivalently,a pointer to the initial element of an array object) and E2 is an integer, E1[E2] designates the E2-th element of E1 (counting from zero).
所以 s[i]
等价于 *( s + i )
从数学的角度来看等价于 *( i + s )
并且在 C 中可以像 i[s]
那样重写,因为在任何情况下表达式都被认为像 *( i + s )
。
因此所有这些结构
s[ i ]
*(s+i)
*(i+s)
i[s]
在 C 中是等效的,表示数组 s
的 i-th
元素。
关于你对我的回答的评论
Could you please explain how the for loop becomes true during the initial iteration?
然后数组 s
由字符串文字 "d"
初始化。
char s[ ] = "d";
字符串文字本身包含终止零字符 '\0'
。所以上面的声明实际上可以等价地改写成下面的方式
char s[ ] = { 'd', '\0' };
由于数组的第一个元素不等于零(它等于字符'd'
)那么条件s[i]
是等价的当 i
等于 0
时,条件 s[i] != 0
为真。
以及关于 for 语句的引用(6.8.5 迭代语句)
4 An iteration statement causes a statement called the loop body to be executed repeatedly until the controlling expression compares equal to 0. The repetition occurs regardless of whether the loop body is entered from the iteration statement or by a jump.1
关于c - for循环在C中给出意想不到的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56892510/
我是一名优秀的程序员,十分优秀!