Re: [问题] 请教一些观念题(指标,容量,reference)

楼主: cjcat2266 (CJ Cat)   2014-10-25 14:31:53
※ 引述《kdok123 (小天)》之铭言:
: ex1:
: int a = pow(2,31);
: cout << a; // -2147483658
: int b = pow(2,31)+1;
: cout << b; // -2147283658
: 为什么在int的情况就无法循环呢?
pow的回传值是浮点数
2的31次方的浮点数精准度会把1吸收掉
所以那个+1是没有效果的
最后转成整数,值就会一样
解决方法是不用pow
int a = 1 << 31;
int b = (1 << 31) + 1;
: ex2:
: void test(char *&a)
: { // 问题二
: cout << sizeof(a)/sizeof(char);// 想要在函数里知道传进来矩阵的长度
: 试了一些方式都不成功,
: 请问有办法达成这个功能吗?
: }
: int main()
: {
: char a[] = {'1','2','\0'};
: char *b = "12";
: test(a);//报错
: test(b);//正常
: //问题三:在没有reference的情况两个都可以传进去,但有reference
: 后矩阵就传不进去了,为什么?
: return 0;
: }
可以用一些"稍微花俏一点"的macro或者template达成
但是建议还是自己传入阵列长度吧
char * & 是 reference to a pointer to a char
a的型别是 array of 3 chars (编译器会自动帮你在[]里面塞上3)
两者不是相容型别,但是array可以隐晦转型为pointer
其值为array第一个元素的位址
在test里实际执行的是 sizeof(char * &) / sizeof(char)
sizeof(char) 永远等于 1
所以整个expression最终只是等于 sizeof(char * &)
这个值在不同的环境下会不同
你的 test(b) 会正常只是刚好而已
你不管传入多长的字串 b ,回传值都会是 sizeof(char * &)
: ex3:
: 置底十三诫的第八诫要表达什么呢? 我编译出来没遇到什么问题
: 置底十三诫的第九诫,MACRO(++x)应该也跟第八诫要表达的一样
: 想请问这两边要阐述什么样的观念呢?
int x = 0;
int y = (x += 1) + (x *= 2);
这会产生未定义行为
你无法保证 x += 1 还是 x *= 2 会先执行
所以不同的环境下你会得到不同的结果
y 可能会是 3 也有可能会是 1
至于macro,请考虑以下范例
#define ADD(x, y) x + y
int x = 10 * ADD(1 + 1, 1 + 1) * 5;
展开之后会变成
int x = 10 * 1 + 1 + 1 + 1 * 5;
x 最后是 17 而不是想像中的 10 * 4 * 5 == 200
加上括号后
#define ADD(x, y) ((x) + (y))
展开结果是
int x = 10 * ((1 + 1) + (1 + 1)) * 5;
这才是你要的结果
作者: LPH66 (-6.2598534e+18f)   2014-10-25 14:34:00
如果要真的找某型别的最大/最小值, 有一系列的 macro 能用对 int 来说是 INT_MAX 跟 INT_MIN这些 macro 定义在 <climits> 里
作者: CaptainH (Cannon)   2014-10-25 15:21:00
overflow也是未定义行为
楼主: cjcat2266 (CJ Cat)   2014-10-25 15:54:00
噢,那这样就如LPH所说的,用climit吧
作者: kdok123 (小天)   2014-10-25 17:24:00
感谢! 我大概了解了! 想请问一下,所以最大/最小值的唯一解就是climit了吗? 因为好多人提醒我undefinedbehavior因为若是用~MAX+1,在求MAX的同时还是overflow了...
作者: EdisonX (卡卡兽)   2014-10-25 17:43:00
上一句推文,已假定是2补数系统了,1补数的话不成立。
作者: CaptainH (Cannon)   2014-10-25 17:43:00
作者: carylorrk (carylorrk)   2014-10-25 18:04:00
shift 超过 signed 上限在新版里好像改成 imp-def 了?
作者: ibmibmibm (BestSteve)   2014-10-27 22:13:00
C++有<limits>中的std::numeric_limits<int>::max()

Links booklink

Contact Us: admin [ a t ] ucptt.com