※ 引述《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;
这才是你要的结果