user-0 提问: 新人学习C，两个问题卡了很久……

回复:
user: user-1
content: 引用 18 楼 sholber 的回复:好在你没弄成 void mian ()   #include  <stdio.h> main() { printf("hello, world\n"); }  Figure 7.1 Classic C program When  we  compile  and  run  the  program  in  Figure7.1,  we  see  that  the  exit  code  is random.  If we  compile  the  same  program  on  different  systems,  we  ar elikely  to  get different exit codes, depending on the contents of the stack and register contents at the time that the main function returns:  c99规定两种形式 int main(int argc ,char *argv []) 和 int main()

user: user-2
content: 引用 25 楼 my_live_123 的回复:[quote=引用 24 楼 sholber 的回复:] [quote=引用 22 楼 my_live_123 的回复:] [quote=引用 20 楼 sholber 的回复:] [quote=引用 19 楼 my_live_123 的回复:] [quote=引用 18 楼 sholber 的回复:] 好在你没弄成 void mian ()   #include  <stdio.h> main() { printf("hello, world\n"); }  Figure 7.1 Classic C program When  we  compile  and  run  the  program  in  Figure7.1,  we  see  that  the  exit  code  is random.  If we  compile  the  same  program  on  different  systems,  we  ar elikely  to  get different exit codes, depending on the contents of the stack and register contents at the time that the main function returns:  c99规定两种形式 int main(int argc ,char *argv []) 和 int main()[/quote]  你说得不对。 1，C99支持所规定的形式，第一种是 int main (int argc, char * argv []) {/* ... */} 或者其等价形式 int main (int argc, char * * argv) {/* ... */} 也支持没有参数的形式 int main (void) {/* ... */} 因为C99要求使用原型，所以它决不会规定你说的那种K&R形式： int main () {/* ... */} 还有，C99也允许C的实现规定的其它形式，比如 int main (int argc, char * * argv, char * env, char * apple) {/* ... */} 如果是在独立式执行环境中，main函数不是必需的。  2，main有一个特殊的地方 ，C99规定，如果main函数没有return语句，则默认返回0。  3，关于main函数的返回类型。在早期的C中，如果一个文件作用域的标识符在声明时没有类型指定符，则默认的类型是int。因此， main (void) {/* ... */} 意味着 int main (void) {/* ... */} 但是新标准禁止这种没有类型指定符的做法，但很多C的实现仍然可以接受。无论如何，C语言在历史上从来没有将main函数的返回类型指定为void，省略类型指定符int并不意味着它可以，或者就是void。[/quote]  咱俩的标准还不是一个了？ The function called at program startup is named main. The implementation declares no prototype for this function. It shall be defined with a return type of int and with no parameters: int main(void) { /* ... */ } or with two parameters (referred to here as argc and argv, though any names may be used, as they are local to the function in which they are declared): int main(int argc, char *argv[]) { /* ... */ } or equivalent; 9)or in some other implementation-defined manner. 然后页低还有个标注： Thus, int can be replaced by a typedef name defined as int , or the type of argv can be written as char ** argv, and so on. 因此，ssize_t也能用做返回值的声明，char *argv[] 等价于char **argv，要是算起来有6种写法。  ssize_t main(void){} int main(void){} int main(int argc, char *argv[]){} int main(int argc, char **argv){} ssize_t main(int argc, char *argv[]){} ssize_t main(int argc, char **argv){}  要是自己再定义typedef，又有多少种呢？你钻牛角了，我承认上面main中少了void   int main (int argc, char * * argv, char * env)  Because  ISO  C  specifies  that  the main function  be  written  with  two  arguments,  and because  this  third argument  provides  no  benefit  over  the  global  variable environ, POSIX.1  specifies  that environ should  be  used  instead  of  the  (possible)  third argument.  Access to  specific  environment  variables  is  normally  through  the getenv and putenv functions 最后2.3条观点是对的  说明一点：入口函数和编译器也有很大关系。gcc编译时使用-e参数可以指定自己的的入口点函数，换言之，源程序并不是必须以main入口点！不过很少使用。   [/quote]  我想到了这个方面，但没想到你会把它提出来： singed main (signed a, char * * b) {/* ... */} 这都没问题。这样看来，是你在钻牛角尖啦。[/quote] 切，明明是你自己非要把char *argv[]等价于char **argv单独拉出来算一种情况，自己去看你的回复！斗这嘴没啥意思[/quote]  有意思！当然有意思了！ 我的目标是积分超过赵老湿，然后，就不再上CSDN了。因为我还有很多正事要做哩。 你真豪爽，我开始喜欢你了。 # define o int #define k main  o k (void) ??< printf ("你真豪爽，嚓！"); ??>

user: user-1
content: 引用 24 楼 sholber 的回复:[quote=引用 22 楼 my_live_123 的回复:] [quote=引用 20 楼 sholber 的回复:] [quote=引用 19 楼 my_live_123 的回复:] [quote=引用 18 楼 sholber 的回复:] 好在你没弄成 void mian ()   #include  <stdio.h> main() { printf("hello, world\n"); }  Figure 7.1 Classic C program When  we  compile  and  run  the  program  in  Figure7.1,  we  see  that  the  exit  code  is random.  If we  compile  the  same  program  on  different  systems,  we  ar elikely  to  get different exit codes, depending on the contents of the stack and register contents at the time that the main function returns:  c99规定两种形式 int main(int argc ,char *argv []) 和 int main()[/quote]  你说得不对。 1，C99支持所规定的形式，第一种是 int main (int argc, char * argv []) {/* ... */} 或者其等价形式 int main (int argc, char * * argv) {/* ... */} 也支持没有参数的形式 int main (void) {/* ... */} 因为C99要求使用原型，所以它决不会规定你说的那种K&R形式： int main () {/* ... */} 还有，C99也允许C的实现规定的其它形式，比如 int main (int argc, char * * argv, char * env, char * apple) {/* ... */} 如果是在独立式执行环境中，main函数不是必需的。  2，main有一个特殊的地方 ，C99规定，如果main函数没有return语句，则默认返回0。  3，关于main函数的返回类型。在早期的C中，如果一个文件作用域的标识符在声明时没有类型指定符，则默认的类型是int。因此， main (void) {/* ... */} 意味着 int main (void) {/* ... */} 但是新标准禁止这种没有类型指定符的做法，但很多C的实现仍然可以接受。无论如何，C语言在历史上从来没有将main函数的返回类型指定为void，省略类型指定符int并不意味着它可以，或者就是void。[/quote]  咱俩的标准还不是一个了？ The function called at program startup is named main. The implementation declares no prototype for this function. It shall be defined with a return type of int and with no parameters: int main(void) { /* ... */ } or with two parameters (referred to here as argc and argv, though any names may be used, as they are local to the function in which they are declared): int main(int argc, char *argv[]) { /* ... */ } or equivalent; 9)or in some other implementation-defined manner. 然后页低还有个标注： Thus, int can be replaced by a typedef name defined as int , or the type of argv can be written as char ** argv, and so on. 因此，ssize_t也能用做返回值的声明，char *argv[] 等价于char **argv，要是算起来有6种写法。  ssize_t main(void){} int main(void){} int main(int argc, char *argv[]){} int main(int argc, char **argv){} ssize_t main(int argc, char *argv[]){} ssize_t main(int argc, char **argv){}  要是自己再定义typedef，又有多少种呢？你钻牛角了，我承认上面main中少了void   int main (int argc, char * * argv, char * env)  Because  ISO  C  specifies  that  the main function  be  written  with  two  arguments,  and because  this  third argument  provides  no  benefit  over  the  global  variable environ, POSIX.1  specifies  that environ should  be  used  instead  of  the  (possible)  third argument.  Access to  specific  environment  variables  is  normally  through  the getenv and putenv functions 最后2.3条观点是对的  说明一点：入口函数和编译器也有很大关系。gcc编译时使用-e参数可以指定自己的的入口点函数，换言之，源程序并不是必须以main入口点！不过很少使用。   [/quote]  我想到了这个方面，但没想到你会把它提出来： singed main (signed a, char * * b) {/* ... */} 这都没问题。这样看来，是你在钻牛角尖啦。[/quote] 切，明明是你自己非要把char *argv[]等价于char **argv单独拉出来算一种情况，自己去看你的回复！斗这嘴没啥意思

user: user-2
content: 引用 22 楼 my_live_123 的回复:[quote=引用 20 楼 sholber 的回复:] [quote=引用 19 楼 my_live_123 的回复:] [quote=引用 18 楼 sholber 的回复:] 好在你没弄成 void mian ()   #include  <stdio.h> main() { printf("hello, world\n"); }  Figure 7.1 Classic C program When  we  compile  and  run  the  program  in  Figure7.1,  we  see  that  the  exit  code  is random.  If we  compile  the  same  program  on  different  systems,  we  ar elikely  to  get different exit codes, depending on the contents of the stack and register contents at the time that the main function returns:  c99规定两种形式 int main(int argc ,char *argv []) 和 int main()[/quote]  你说得不对。 1，C99支持所规定的形式，第一种是 int main (int argc, char * argv []) {/* ... */} 或者其等价形式 int main (int argc, char * * argv) {/* ... */} 也支持没有参数的形式 int main (void) {/* ... */} 因为C99要求使用原型，所以它决不会规定你说的那种K&R形式： int main () {/* ... */} 还有，C99也允许C的实现规定的其它形式，比如 int main (int argc, char * * argv, char * env, char * apple) {/* ... */} 如果是在独立式执行环境中，main函数不是必需的。  2，main有一个特殊的地方 ，C99规定，如果main函数没有return语句，则默认返回0。  3，关于main函数的返回类型。在早期的C中，如果一个文件作用域的标识符在声明时没有类型指定符，则默认的类型是int。因此， main (void) {/* ... */} 意味着 int main (void) {/* ... */} 但是新标准禁止这种没有类型指定符的做法，但很多C的实现仍然可以接受。无论如何，C语言在历史上从来没有将main函数的返回类型指定为void，省略类型指定符int并不意味着它可以，或者就是void。[/quote]  咱俩的标准还不是一个了？ The function called at program startup is named main. The implementation declares no prototype for this function. It shall be defined with a return type of int and with no parameters: int main(void) { /* ... */ } or with two parameters (referred to here as argc and argv, though any names may be used, as they are local to the function in which they are declared): int main(int argc, char *argv[]) { /* ... */ } or equivalent; 9)or in some other implementation-defined manner. 然后页低还有个标注： Thus, int can be replaced by a typedef name defined as int , or the type of argv can be written as char ** argv, and so on. 因此，ssize_t也能用做返回值的声明，char *argv[] 等价于char **argv，要是算起来有6种写法。  ssize_t main(void){} int main(void){} int main(int argc, char *argv[]){} int main(int argc, char **argv){} ssize_t main(int argc, char *argv[]){} ssize_t main(int argc, char **argv){}  要是自己再定义typedef，又有多少种呢？你钻牛角了，我承认上面main中少了void   int main (int argc, char * * argv, char * env)  Because  ISO  C  specifies  that  the main function  be  written  with  two  arguments,  and because  this  third argument  provides  no  benefit  over  the  global  variable environ, POSIX.1  specifies  that environ should  be  used  instead  of  the  (possible)  third argument.  Access to  specific  environment  variables  is  normally  through  the getenv and putenv functions 最后2.3条观点是对的  说明一点：入口函数和编译器也有很大关系。gcc编译时使用-e参数可以指定自己的的入口点函数，换言之，源程序并不是必须以main入口点！不过很少使用。   [/quote]  我想到了这个方面，但没想到你会把它提出来： singed main (signed a, char * * b) {/* ... */} 这都没问题。这样看来，是你在钻牛角尖啦。

user: user-3
content: 引用 7 楼 Newbeeskywrc 的回复:引用 5 楼 www4206 的回复:你写代码的时候，稍微规范下编码习惯请问哪里不规范呢？有没有比较好的关于代码规范方面的资料或书籍？  代码看起来还可以，布局有点问题，注意缩进 代码规范方面的权威书籍是《代码大全》，当初看的时候，边看后背边流冷汗

user: user-1
content: 引用 20 楼 sholber 的回复:[quote=引用 19 楼 my_live_123 的回复:] [quote=引用 18 楼 sholber 的回复:] 好在你没弄成 void mian ()   #include  <stdio.h> main() { printf("hello, world\n"); }  Figure 7.1 Classic C program When  we  compile  and  run  the  program  in  Figure7.1,  we  see  that  the  exit  code  is random.  If we  compile  the  same  program  on  different  systems,  we  ar elikely  to  get different exit codes, depending on the contents of the stack and register contents at the time that the main function returns:  c99规定两种形式 int main(int argc ,char *argv []) 和 int main()[/quote]  你说得不对。 1，C99支持所规定的形式，第一种是 int main (int argc, char * argv []) {/* ... */} 或者其等价形式 int main (int argc, char * * argv) {/* ... */} 也支持没有参数的形式 int main (void) {/* ... */} 因为C99要求使用原型，所以它决不会规定你说的那种K&R形式： int main () {/* ... */} 还有，C99也允许C的实现规定的其它形式，比如 int main (int argc, char * * argv, char * env, char * apple) {/* ... */} 如果是在独立式执行环境中，main函数不是必需的。  2，main有一个特殊的地方 ，C99规定，如果main函数没有return语句，则默认返回0。  3，关于main函数的返回类型。在早期的C中，如果一个文件作用域的标识符在声明时没有类型指定符，则默认的类型是int。因此， main (void) {/* ... */} 意味着 int main (void) {/* ... */} 但是新标准禁止这种没有类型指定符的做法，但很多C的实现仍然可以接受。无论如何，C语言在历史上从来没有将main函数的返回类型指定为void，省略类型指定符int并不意味着它可以，或者就是void。[/quote]  咱俩的标准还不是一个了？ The function called at program startup is named main. The implementation declares no prototype for this function. It shall be defined with a return type of int and with no parameters: int main(void) { /* ... */ } or with two parameters (referred to here as argc and argv, though any names may be used, as they are local to the function in which they are declared): int main(int argc, char *argv[]) { /* ... */ } or equivalent; 9)or in some other implementation-defined manner. 然后页低还有个标注： Thus, int can be replaced by a typedef name defined as int , or the type of argv can be written as char ** argv, and so on. 因此，ssize_t也能用做返回值的声明，char *argv[] 等价于char **argv，要是算起来有6种写法。  ssize_t main(void){} int main(void){} int main(int argc, char *argv[]){} int main(int argc, char **argv){} ssize_t main(int argc, char *argv[]){} ssize_t main(int argc, char **argv){}  要是自己再定义typedef，又有多少种呢？你钻牛角了，我承认上面main中少了void   int main (int argc, char * * argv, char * env)  Because  ISO  C  specifies  that  the main function  be  written  with  two  arguments,  and because  this  third argument  provides  no  benefit  over  the  global  variable environ, POSIX.1  specifies  that environ should  be  used  instead  of  the  (possible)  third argument.  Access to  specific  environment  variables  is  normally  through  the getenv and putenv functions 最后2.3条观点是对的  说明一点：入口函数和编译器也有很大关系。gcc编译时使用-e参数可以指定自己的的入口点函数，换言之，源程序并不是必须以main入口点！不过很少使用。

user: user-4
content: 引用 8 楼 Newbeeskywrc 的回复:  我逐渐理解getchar的原理了，但还是没有出现按任意键继续。按任意键继续 是编译器运行时加上去的

user: user-5
content: 会不会是缓存与输入文件混乱呢~~感觉代码很乱的感觉~~

user: user-2
content: 引用 19 楼 my_live_123 的回复:[quote=引用 18 楼 sholber 的回复:] 好在你没弄成 void mian ()   #include  <stdio.h> main() { printf("hello, world\n"); }  Figure 7.1 Classic C program When  we  compile  and  run  the  program  in  Figure7.1,  we  see  that  the  exit  code  is random.  If we  compile  the  same  program  on  different  systems,  we  ar elikely  to  get different exit codes, depending on the contents of the stack and register contents at the time that the main function returns:  c99规定两种形式 int main(int argc ,char *argv []) 和 int main()[/quote]  你说得不对。 1，C99支持所规定的形式，第一种是 int main (int argc, char * argv []) {/* ... */} 或者其等价形式 int main (int argc, char * * argv) {/* ... */} 也支持没有参数的形式 int main (void) {/* ... */} 因为C99要求使用原型，所以它决不会规定你说的那种K&R形式： int main () {/* ... */} 还有，C99也允许C的实现规定的其它形式，比如 int main (int argc, char * * argv, char * env, char * apple) {/* ... */} 如果是在独立式执行环境中，main函数不是必需的。  2，main有一个特殊的地方 ，C99规定，如果main函数没有return语句，则默认返回0。  3，关于main函数的返回类型。在早期的C中，如果一个文件作用域的标识符在声明时没有类型指定符，则默认的类型是int。因此， main (void) {/* ... */} 意味着 int main (void) {/* ... */} 但是新标准禁止这种没有类型指定符的做法，但很多C的实现仍然可以接受。无论如何，C语言在历史上从来没有将main函数的返回类型指定为void，省略类型指定符int并不意味着它可以，或者就是void。

user: user-6
content: 参考 《C/C++学习指南》 http://www.afanihao.cn/c_guide/  的附录“编码规范”  你的教材太老了，函数竟然不写返回值。  引用 7 楼 Newbeeskywrc 的回复:引用 5 楼 www4206 的回复:你写代码的时候，稍微规范下编码习惯请问哪里不规范呢？有没有比较好的关于代码规范方面的资料或书籍？

user: user-1
content: 引用 26 楼 sholber 的回复:[quote=引用 25 楼 my_live_123 的回复:] [quote=引用 24 楼 sholber 的回复:] [quote=引用 22 楼 my_live_123 的回复:] [quote=引用 20 楼 sholber 的回复:] [quote=引用 19 楼 my_live_123 的回复:] [quote=引用 18 楼 sholber 的回复:] 好在你没弄成 void mian ()   #include  <stdio.h> main() { printf("hello, world\n"); }  Figure 7.1 Classic C program When  we  compile  and  run  the  program  in  Figure7.1,  we  see  that  the  exit  code  is random.  If we  compile  the  same  program  on  different  systems,  we  ar elikely  to  get different exit codes, depending on the contents of the stack and register contents at the time that the main function returns:  c99规定两种形式 int main(int argc ,char *argv []) 和 int main()[/quote]  你说得不对。 1，C99支持所规定的形式，第一种是 int main (int argc, char * argv []) {/* ... */} 或者其等价形式 int main (int argc, char * * argv) {/* ... */} 也支持没有参数的形式 int main (void) {/* ... */} 因为C99要求使用原型，所以它决不会规定你说的那种K&R形式： int main () {/* ... */} 还有，C99也允许C的实现规定的其它形式，比如 int main (int argc, char * * argv, char * env, char * apple) {/* ... */} 如果是在独立式执行环境中，main函数不是必需的。  2，main有一个特殊的地方 ，C99规定，如果main函数没有return语句，则默认返回0。  3，关于main函数的返回类型。在早期的C中，如果一个文件作用域的标识符在声明时没有类型指定符，则默认的类型是int。因此， main (void) {/* ... */} 意味着 int main (void) {/* ... */} 但是新标准禁止这种没有类型指定符的做法，但很多C的实现仍然可以接受。无论如何，C语言在历史上从来没有将main函数的返回类型指定为void，省略类型指定符int并不意味着它可以，或者就是void。[/quote]  咱俩的标准还不是一个了？ The function called at program startup is named main. The implementation declares no prototype for this function. It shall be defined with a return type of int and with no parameters: int main(void) { /* ... */ } or with two parameters (referred to here as argc and argv, though any names may be used, as they are local to the function in which they are declared): int main(int argc, char *argv[]) { /* ... */ } or equivalent; 9)or in some other implementation-defined manner. 然后页低还有个标注： Thus, int can be replaced by a typedef name defined as int , or the type of argv can be written as char ** argv, and so on. 因此，ssize_t也能用做返回值的声明，char *argv[] 等价于char **argv，要是算起来有6种写法。  ssize_t main(void){} int main(void){} int main(int argc, char *argv[]){} int main(int argc, char **argv){} ssize_t main(int argc, char *argv[]){} ssize_t main(int argc, char **argv){}  要是自己再定义typedef，又有多少种呢？你钻牛角了，我承认上面main中少了void   int main (int argc, char * * argv, char * env)  Because  ISO  C  specifies  that  the main function  be  written  with  two  arguments,  and because  this  third argument  provides  no  benefit  over  the  global  variable environ, POSIX.1  specifies  that environ should  be  used  instead  of  the  (possible)  third argument.  Access to  specific  environment  variables  is  normally  through  the getenv and putenv functions 最后2.3条观点是对的  说明一点：入口函数和编译器也有很大关系。gcc编译时使用-e参数可以指定自己的的入口点函数，换言之，源程序并不是必须以main入口点！不过很少使用。   [/quote]  我想到了这个方面，但没想到你会把它提出来： singed main (signed a, char * * b) {/* ... */} 这都没问题。这样看来，是你在钻牛角尖啦。[/quote] 切，明明是你自己非要把char *argv[]等价于char **argv单独拉出来算一种情况，自己去看你的回复！斗这嘴没啥意思[/quote]  有意思！当然有意思了！ 我的目标是积分超过赵老湿，然后，就不再上CSDN了。因为我还有很多正事要做哩。 你真豪爽，我开始喜欢你了。 # define o int #define k main  o k (void) ??< printf ("你真豪爽，嚓！"); ??>[/quote]

user: user-2
content: 好在你没弄成 void mian ()

user: user-7
content: 用Ctrl+F5，就是不调试的运行，最后系统会给你来一个按任意键继续的 另外flush(stdin)是未定义行为，不一定有用 另外getchar早就不用了。。

user: user-8
content: 区分 getchar() 和scanf()

user: user-9
content: Ctrl+f5 Ctrl+f7

user: user-10
content: 另外，这个编码风格真是要改啊！

user: user-10
content: 把 while语句的括号带上试试。

user: user-11
content: 楼主，我运行了你的程序，同样是在Dev C++ 环境下 ，运行是正常的，更改了输出 %ld之后 在输入完成之后摁 ctrl+z 结束，可能是结束建输入的不对吧

user: user-12
content: 楼主搞定了吗

user: user-13
content: getch() 试试