user-0 提问: 大一软件工程新生在接触C语言时的一些简单的问题

回复:
user: user-1
content: 这和编译器的位数有关系

user: user-2
content: 关于C,C++表达式求值顺序 http://blog.csdn.net/fefe82/article/details/37833767，http://bbs.csdn.net/topics/370153775 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-3
content: 我也觉得这书垃圾，

user: user-4
content: 所有的解释都是无意义的，这本破书还给老师吧

user: user-5
content: 学校 的书就是教一些不实用的东西,考试就喜欢考偏难怪

user: user-6
content: 这种书就是误人子弟，让新手在这种问题上浪费时间。

user: user-4
content: 引用 11 楼 Beginner_WZH 的回复:引用 10楼wang0635 的回复:所有的解释都是无意义的，这本破书还给老师吧是啊，感觉很不懂 懂了就怪了，懂了基本上就跟C语言无缘了。

user: user-0
content: 引用 8楼pkuzhx 的回复:这种书就是误人子弟，让新手在这种问题上浪费时间。真的是这样

user: user-0
content: 引用 9楼你我的约定 的回复:学校 的书就是教一些不实用的东西,考试就喜欢考偏难怪哈哈，我感觉也是

user: user-0
content: 引用 10楼wang0635 的回复:所有的解释都是无意义的，这本破书还给老师吧是啊，感觉很不懂

user: user-0
content: 引用 6楼_mervyn 的回复:i++ 先引用后自增, ++i 先自增后引用，--同理 例： int i=3; j =  i++；// 同 j=i；i=i+1； 结果：i 等于4 ，j 等于3  int i=3; j= ++i; //同 i=i+1; j=i; 结果：i等于4，j 等于4  同理， j=(++i)+(++i) // 同i=i+1；i=i+1；j=i+i；  那么你自己去理解 j=(++i)+(++i)+(++i)+(++i)吧，是不是觉得可以有多种理解了？ 那就对了，所以才会有不同编译器的不同种解释，所以也不建议这么写代码。   至于第四题，我先举个例子： 比如有这样一个函数 int foo（int  x , int  y）; 然后这样调用： int a = 3； foo（a=a+1，a=a+1）; 那么在vc中，实际上传给foo函数的参数为 (5,5)  虽然函数参数的入栈顺序是从右往左的，但是函数参数列表中表达式的计算顺序好像没有明确定义，不同编译器有不同实现。 vc中，在将参数入栈前，会先把参数的表达式从右往左都计算完毕。 也就是说，在你的例子中，参数入栈前先按以下顺序进行表达式计算： i++；//计算之前 i等于7，计算后i等于8 i--；//计算之前 i等于8 --i； ++i； 所有表达式计算完毕后，i等于7，需要注意的是，对于i++和i--，由于其实现机制，取的是表达式计算之前的值。 所以最后传给printf的参数应该为，7，7，7，8，7 不知道你这书上所写的 7，7， 6， 7，7 用的是vc哪个版本。。。。。i，++i，i--，i++，--i 7    7       8     7        6  是这个意思吗？ 虽然是在地址里面取，但是它们之间相互影响相互运算？

user: user-7
content: i++ 先引用后自增, ++i 先自增后引用，--同理 例： int i=3; j =  i++；// 同 j=i；i=i+1； 结果：i 等于4 ，j 等于3  int i=3; j= ++i; //同 i=i+1; j=i; 结果：i等于4，j 等于4  同理， j=(++i)+(++i) // 同i=i+1；i=i+1；j=i+i；  那么你自己去理解 j=(++i)+(++i)+(++i)+(++i)吧，是不是觉得可以有多种理解了？ 那就对了，所以才会有不同编译器的不同种解释，所以也不建议这么写代码。   至于第四题，我先举个例子： 比如有这样一个函数 int foo（int  x , int  y）; 然后这样调用： int a = 3； foo（a=a+1，a=a+1）; 那么在vc中，实际上传给foo函数的参数为 (5,5)  虽然函数参数的入栈顺序是从右往左的，但是函数参数列表中表达式的计算顺序好像没有明确定义，不同编译器有不同实现。 vc中，在将参数入栈前，会先把参数的表达式从右往左都计算完毕。 也就是说，在你的例子中，参数入栈前先按以下顺序进行表达式计算： i++；//计算之前 i等于7，计算后i等于8 i--；//计算之前 i等于8 --i； ++i； 所有表达式计算完毕后，i等于7，需要注意的是，对于i++和i--，由于其实现机制，取的是表达式计算之前的值。 所以最后传给printf的参数应该为，7，7，7，8，7 不知道你这书上所写的 7，7， 6， 7，7 用的是vc哪个版本。。。。。

user: user-0
content: 引用 1楼user-9 的回复:1. TC 是 Turbo C,  DOS 下的 16 为编译器 2. C 和 C++ 标准不一样, 文件名为 .c 时按 C 的标准来, 为 .cpp 是按 C++ 的标准来.    "" 是字符串, '' 是字符, 两码事. C 语言里字符被当做 int 型了.  后面的 ++i, i++ 那些, 在同一个表达式里面使用多个带有副作用的操作行为是未定义的那他是通过怎么样的运算得出的结果啊，单引号表示一个字符，双引号代表一个字符串？

user: user-0
content: 引用 3楼我是你的主体 的回复:[quote=引用 2楼自信男孩 的回复:]TC很老的编辑和编译器了。现在很少用了，因为它还认为int a；的长度是2字节；现在int类型的变量普遍是4字节或者8字节（64位系统）； 'a'是字符，"a"是字符串；sizeof是计算某变量或者类型的长度；'a'常量被认为是4，因为是其类型隐式提升了，（char 提升至int）。 int i=3；j=(++i)+(++i)+(++i)+(++i);对于这个问题，老生常谈了，对于这样的跟编译器有关，不建议这么写和使用，要么分开写，要么计算之后再相加；我觉得这个式子不应该是4+5+6+7=22吗，为什么是23啊[/quote]5+5=10   10+6=16什么的都是怎么来的啊，还有图片第四个，为什么是7 7 6 7 7

user: user-0
content: 引用 2楼自信男孩 的回复:TC很老的编辑和编译器了。现在很少用了，因为它还认为int a；的长度是2字节；现在int类型的变量普遍是4字节或者8字节（64位系统）； 'a'是字符，"a"是字符串；sizeof是计算某变量或者类型的长度；'a'常量被认为是4，因为是其类型隐式提升了，（char 提升至int）。 int i=3；j=(++i)+(++i)+(++i)+(++i);对于这个问题，老生常谈了，对于这样的跟编译器有关，不建议这么写和使用，要么分开写，要么计算之后再相加；我觉得这个式子不应该是4+5+6+7=22吗，为什么是23啊

user: user-8
content: TC很老的编辑和编译器了。现在很少用了，因为它还认为int a；的长度是2字节；现在int类型的变量普遍是4字节或者8字节（64位系统）； 'a'是字符，"a"是字符串；sizeof是计算某变量或者类型的长度；'a'常量被认为是4，因为是其类型隐式提升了，（char 提升至int）。 int i=3；j=(++i)+(++i)+(++i)+(++i);对于这个问题，老生常谈了，对于这样的跟编译器有关，不建议这么写和使用，要么分开写，要么计算之后再相加；

user: user-9
content: 1. TC 是 Turbo C,  DOS 下的 16 为编译器 2. C 和 C++ 标准不一样, 文件名为 .c 时按 C 的标准来, 为 .cpp 是按 C++ 的标准来.    "" 是字符串, '' 是字符, 两码事. C 语言里字符被当做 int 型了.  后面的 ++i, i++ 那些, 在同一个表达式里面使用多个带有副作用的操作行为是未定义的