C标准 (5.1.2.2.1程序启动)说:
在程序启动时调用的函数名为main。..。 它应该是带返回类型int且没有参数的defined:
int main(void) { /* ... */ }
或者有两个参数:int main(int argc, char *argv[]) { /* ... */ }
后来又说:
argc值应为非负值。
argc
不应该被定义为unsigned int
,argc
的意思应该是‘参数计数’?argc
作为argv
的索引所以我开始怀疑C标准是否反映了数组索引的类型。签了吗?
6.5.2.1数组订阅
其中一个表达式应具有“指向对象类型的指针”类型,另一个表达式应具有整数类型,而结果类型为“类型”。
它没有提到它的签名(或者我没有找到)。使用负数组索引(array[-1]
)的代码非常常见,但它不是未定义的行为吗?
发布于 2010-03-14 06:13:18
main()中使用int的原因是历史的--它一直是这样的,早在语言标准化之前就有了。数组索引的要求是它在数组的范围内(或者在某些情况下,超过一个结束)--其他的任何东西都是未定义的,所以签名是无关紧要的。
发布于 2010-03-14 06:31:20
1) main() argc类型: IMHO标准延续了一个非常古老的传统( 30多年!),现在.现在进行更改已经太晚了(注意:在大多数系统中,编译器、链接器和CPU都不会抱怨"argc“是否定义为”无符号“,但这是不符合标准的!)
2)在大多数实现中,argvargc是合法的,计算结果为NULL。实际上,找到参数列表末尾的另一种方法是从0开始迭代argv,当argvi为NULL时终止。
3)当地址范围从(P)到p属于同一内存对象时,带有负数的数组/指针算法是合法的。也就是说,你可以
char array[100];
char *p;
p = &array[50];
p += -30; /* Now p points to array[20]. */
这种指针算法的使用是合法的,因为结果指针仍然保留在原始内存对象(“数组”)中。在大多数系统上,指针算法可以用来在内存中导航,这违反了这一规则,但这是不可移植的,因为它完全依赖于系统。
发布于 2010-03-14 15:13:31
一般来说,在C中,“最小惊奇原则”意味着最好是使一个变量有符号,除非有充分的理由使它没有符号。这是因为当混合有符号值和无符号值时,类型提升规则可能导致意外的结果:例如,如果argc
是无符号的,那么这个简单的比较会导致令人惊讶的结果:
if (argc > -1)
( -1
被提升为unsigned int
,因此它的值被转换为UINT_MAX
,这几乎肯定大于argc
)。
https://stackoverflow.com/questions/2442411
复制相似问题