C 需要帮助理解这些for循环输出吗
我还是不明白上次它在干什么C 需要帮助理解这些for循环输出吗,c,C,我还是不明白上次它在干什么 当它到达4
当它到达
4<4 | |?
时,它是否应该中断?此代码具有未定义的行为,因为它将访问数组外部的元素。如果将代码更改为以下内容,则可以看到此行为:
int i, a[2] = {-6, -4};
for (i = 0; i < 4 || a[i]; i++)
putchar('*');
这是访问9个元素(索引8是从零开始的索引数组的元素9)。一旦你有了未定义的行为,所有的赌注基本上都是无效的。程序也可能会循环,直到出现分段错误
当
i==4
或i
大于4时,它不会中断,因为a[i]
为真,因此i<4|a[i]
也为真a[i]
在数组长度内为true,然后您访问数组外的某个元素(第8个元素,索引7),然后您有未定义的行为。此代码有未定义的行为,因为它将访问数组外的元素。如果将代码更改为以下内容,则可以看到此行为:
int i, a[2] = {-6, -4};
for (i = 0; i < 4 || a[i]; i++)
putchar('*');
这是访问9个元素(索引8是从零开始的索引数组的元素9)。一旦你有了未定义的行为,所有的赌注基本上都是无效的。程序也可能会循环,直到出现分段错误
当
i==4
或i
大于4时,它不会中断,因为a[i]
为真,因此i<4|a[i]
也为真a[i]
在数组长度内为true,然后您访问数组外的某个元素(第8个元素,索引7),然后您有未定义的行为。此代码有未定义的行为,因为它将访问数组外的元素。如果将代码更改为以下内容,则可以看到此行为:
int i, a[2] = {-6, -4};
for (i = 0; i < 4 || a[i]; i++)
putchar('*');
这是访问9个元素(索引8是从零开始的索引数组的元素9)。一旦你有了未定义的行为,所有的赌注基本上都是无效的。程序也可能会循环,直到出现分段错误
当
i==4
或i
大于4时,它不会中断,因为a[i]
为真,因此i<4|a[i]
也为真a[i]
在数组长度内为true,然后您访问数组外的某个元素(第8个元素,索引7),然后您有未定义的行为。此代码有未定义的行为,因为它将访问数组外的元素。如果将代码更改为以下内容,则可以看到此行为:
int i, a[2] = {-6, -4};
for (i = 0; i < 4 || a[i]; i++)
putchar('*');
这是访问9个元素(索引8是从零开始的索引数组的元素9)。一旦你有了未定义的行为,所有的赌注基本上都是无效的。程序也可能会循环,直到出现分段错误
当i==4
或i
大于4时,它不会中断,因为a[i]
为真,因此i<4|a[i]
也为真a[i]
在数组长度内为true,然后访问数组外的某个元素(第8个元素,索引7),然后就有了未定义的行为。您的代码调用,因为循环条件是假的,导致访问数组超出其边界
请记住,在C语言中,对数组没有边界检查,或者在数组末尾没有任何隐式null。许多无效代码编译得很好。作为程序员,您有责任确保代码有效
正确的循环条件将确保阵列不会在其边界之外被访问:
Accessing element: 0
*Accessing element: 1
*Accessing element: 2
*Accessing element: 3
*Accessing element: 4
*Accessing element: 5
*Accessing element: 6
*Accessing element: 7
*Accessing element: 8
*
for(i=0;i<(a的大小/a的大小[0])&&a[i];i++)
putchar('*');
您的代码之所以调用,是因为循环条件是伪造的,导致访问数组超出其边界
请记住,在C语言中,对数组没有边界检查,或者在数组末尾没有任何隐式null。许多无效代码编译得很好。作为程序员,您有责任确保代码有效
正确的循环条件将确保阵列不会在其边界之外被访问:
Accessing element: 0
*Accessing element: 1
*Accessing element: 2
*Accessing element: 3
*Accessing element: 4
*Accessing element: 5
*Accessing element: 6
*Accessing element: 7
*Accessing element: 8
*
for(i=0;i<(a的大小/a的大小[0])&&a[i];i++)
putchar('*');
您的代码之所以调用,是因为循环条件是伪造的,导致访问数组超出其边界
请记住,在C语言中,对数组没有边界检查,或者在数组末尾没有任何隐式null。许多无效代码编译得很好。作为程序员,您有责任确保代码有效
正确的循环条件将确保阵列不会在其边界之外被访问:
Accessing element: 0
*Accessing element: 1
*Accessing element: 2
*Accessing element: 3
*Accessing element: 4
*Accessing element: 5
*Accessing element: 6
*Accessing element: 7
*Accessing element: 8
*
for(i=0;i<(a的大小/a的大小[0])&&a[i];i++)
putchar('*');
您的代码之所以调用,是因为循环条件是伪造的,导致访问数组超出其边界
请记住,在C语言中,对数组没有边界检查,或者在数组末尾没有任何隐式null。许多无效代码编译得很好。作为程序员,您有责任确保代码有效
正确的循环条件将确保阵列不会在其边界之外被访问:
Accessing element: 0
*Accessing element: 1
*Accessing element: 2
*Accessing element: 3
*Accessing element: 4
*Accessing element: 5
*Accessing element: 6
*Accessing element: 7
*Accessing element: 8
*
for(i=0;i<(a的大小/a的大小[0])&&a[i];i++)
putchar('*');
如果整数为非零,则将其视为“真”。第一个例子中的所有情况,只要看一个[I],它的值都是非零的,任何与真或的运算都是真的
(@CyberSpock更详细地解释了这一点)如果整数为非零,则认为它为“真”。第一个例子中的所有情况,只要看一个[I],它的值都是非零的,任何与真或的运算都是真的
(@CyberSpock更详细地解释了这一点)如果整数为非零,则认为它为“真”。第一个例子中的所有情况,只要看一个[I],它的值都是非零的,任何与真或的运算都是真的
(@CyberSpock更详细地解释了这一点)整数被认为是一个整数
#define N 7
for (i = 0; i < N && a[i]; i++)