wujr5 / c-and-cpp-language-learning

C和C++编程语言学习 - 2015级
67 stars 34 forks source link

软件:12周理论作业 #44

Open ghostbody opened 8 years ago

ghostbody commented 8 years ago

一共4个文件,几百题。

现在题库中共563题。同学们可完成每一类别题目中的三分之一。多做不限。

文件在群共享和FTP的Resource文件夹均有。

DDL:

2015年12月30日 18:00 2015年12月30日 21:00

命名:

13331314_叶嘉祺_理论题.pdf

要求,对每道题写简单的解释,并且理解。

most-cute-fangfang commented 8 years ago

TA大大,Sicily上的1002那道序列题,我的做法是把序列写成一个函数,存到以1开始的数组里,然后输入的数字与小于等于它的数相比较,如果有相同的就输出[ ]里面的数字。但是我调用函数的时候,要跟里面的数列比较,编译说没有声明数组名s[ ].....我好方....

ghostbody commented 8 years ago

@most-cute-fangfang 不明白你说啥?

JerryChan31 commented 8 years ago

@ghostbody 写成什么形式?…pdf还是md?

ghostbody commented 8 years ago

@JerryChan31 看要求 ╮(╯▽╰)╭

JerryChan31 commented 8 years ago

@ghostbody 请教一个理论题的问题:

include

void main()
{
  1 < 2 ? return 1 : return 2;
}

这里编译器编译提示 [Error] expected expression before 'return' return左边为什么还要有表达式?… 还有return到底是个什么东西?…上网查查不到…

ghostbody commented 8 years ago

@JerryChan31 1. void main是没有返回值的。2. 你要理解这个三目运算的意思,是前面的表达式为真执行return1,若为假执行后面的表达式。

也就是:

if(1 < 2) {
  return 1;
} else {
  return 2;
}
Icenowy commented 8 years ago

另外有一点,C标准要求main返回值类型为int。void main是国内部分教科书的错误写法,由于某些技术原因在x86平台上不会出错,但是影响程序可移植性。

(事实上按照C标准编译器可以在这里报错,如果它严格检查标准

---- JerryChan31编写 ----

@ghostbody 请教一个理论题的问题:

include

void main()
{
  1 < 2 ? return 1 : return 2;
}

这里编译器编译提示 [Error] expected expression before 'return' return左边为什么还要有表达式?… 还有return到底是个什么东西?…上网查查不到…


Reply to this email directly or view it on GitHub: https://github.com/wujr5/c-and-cpp-language-learning/issues/44#issuecomment-166835582

JerryChan31 commented 8 years ago

@ghostbody 也是理论题里的一个问题。

include

#include<string.h>
#pragma warning(disable:4996)
int main()
{
    char *str = "hello, world!!\n";
    char strc[] = "good morning\n";
    strcpy(strc, str);
    printf("%s\n", strc);
    return 0;
}

这个程序为什么执行strcpy以后strc的数组不会越界?就算把strc初始化改成“g”也正常输出… 然而在百度上找到这个…… image

ghostbody commented 8 years ago

@JerryChan31 越界了啦,没报错而已。

JerryChan31 commented 8 years ago

@ghostbody 咦但是它可以输出正确答案

MarshallW906 commented 8 years ago

@JerryChan31 gcc里对于字符串越界的处理似乎就是这样…… 比如

char s[5] = "hahahaahahahahah";
printf("%s", s);

这样不会报错,不会RE,它自己给你扩充了空间 具体为何我也不清楚

ghostbody commented 8 years ago

@MarshallW906 后面会出乱码,编译器也会警告你。 gcc 4.9.1

zichang06 commented 8 years ago

TA大大,请问这题怎么求解? 而且改为

int *ptr = (int *)100;

的话,答案就是8... 嘤嘤,求解释~~~

zichang06 commented 8 years ago

所以ptr指向十六进制0000 0064(十进制表示为100)的这个地址? 咳咳,好晕呀~~

zichang06 commented 8 years ago
  1. Which of the following declaration throw run-time error? a) int _c = &c; b) int _c = &_c; c) int *_c = **c; d) None of the mentioned View Answer Answer:d

还有这题,给跪了。虽然我连题目看的都不太懂,但是除了B,我的编译器一直报错。ORZ