C和C++中的字符大小是多少?据我所知,char的大小在C和C++中都是1个字节.
#include <stdio.h>
int main()
{
printf("Size of char : %d\n", sizeof(char));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
#include <iostream>
int main()
{
std::cout << "Size of char : " << sizeof(char) << "\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
没有惊喜,它们都给出了输出: Size of char : 1
现在我们知道,字符表示为'a','b','c','|',...所以我只是修改了上面的代码对这些:
在C:
#include <stdio.h>
int main()
{
char a = 'a';
printf("Size of char : %d\n", sizeof(a));
printf("Size of char : %d\n", sizeof('a'));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Size of char …Run Code Online (Sandbox Code Playgroud) 我正在阅读K&R中关于C的联合,据我所知,联合中的单个变量可以包含几种类型中的任何一种,如果某些东西存储为一种类型并且提取为另一种,则结果纯粹是实现定义的.
现在请检查以下代码段:
#include<stdio.h>
int main(void)
{
union a
{
int i;
char ch[2];
};
union a u;
u.ch[0] = 3;
u.ch[1] = 2;
printf("%d %d %d\n", u.ch[0], u.ch[1], u.i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
3 2 515
Run Code Online (Sandbox Code Playgroud)
在这里,我在分配值u.ch,但来自检索u.ch和u.i.它是实现定义的吗?或者我做的事情真的很傻?
我知道这对其他大多数人来说似乎都是初学者,但我无法弄清楚输出背后的原因.
谢谢.
请考虑以下代码段:
int fib(int N)
{
if(N<2) return 1;
return (fib(N-1) + fib(N-2));
}
Run Code Online (Sandbox Code Playgroud)
鉴于fib从主要调用N为10,35,67,...(比如说),总共拨打了多少电话fib?
这个问题有什么关系吗?
PS:这是一个理论问题,不应该被执行.
编辑:
我知道其他方法可以更快地计算Fibonacci系列.
我想要一个解决方案来计算fib被调用为fib(40),fib(50),...而没有编译器的帮助,并且在考试条件下你应该回答40个类似于这个规定的问题时间(约30分钟).
谢谢,
(我不太需要这个答案,我只是好奇.)
是否可以使用条件运算符将每个if-else构造替换为等效的条件表达式?:?
好吧,在通过天真的STL集解决了这个问题后,我正在阅读论坛条目,在那里我找到了这个条目:
#include <iostream>
#include <cmath>
#define MAX 100
using namespace std;
int main(){
int res=(MAX-1)*(MAX-1);
for(int i=2;i<MAX;i++)
for(int j=i*i;j<=MAX;j=j*i)
res = res-int(MAX*(log(i)/log(j)))+1;
cout<<res<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
作者的解释:
Maximum will be 99*99. I subtracted occurrences of those numbers which are powers of some lower numbers (2-100): -
For example: -
4^2,4^3,4^4 (i.e. 3 should be subtracted) as they will be duplicates from lower number powers as in 2^4,2^6,2^8
可能重复:
计算32位整数中设置位数的最佳算法?
给定32位整数N,设计算法以找到N的二进制位表示中的零的数量.
我能想到的最简单的算法是检查零的二进制表示,在C中是这样的:
int num_of_zero(int num)
{
if(0 == num) return 1; /*For the input 0 it should output 1 */
int Count = 0;
while(num>0){
if(0 == (num&1)) Count++;
num >>= 1;
}
return Count;
}
Run Code Online (Sandbox Code Playgroud)
如果有一些算法在恒定时间计算,我就会徘徊.
对于输入0,它应该返回1 而不是32.
对于5,输出应为1.二进制表示为101.
对于7,输出应为0.
确切地说,我正在寻找一种更好的算法来计算32位整数的二进制解释中的(非前导)零的数量.希望问题现在很明显.
编辑:正如Alex Martelli指出的那样,我正在修改我的代码以使其更具可读性并且这次使用迭代.
问题是导出一个公式,用于确定给定十进制数在给定基数中可能具有的位数.
例如:十进制数100006可分别由基数2,3,4,5,6,7,8中的17,11,9,8,7,6,8位数表示.
那么我到目前为止得到的公式是这样的:(log10(num)/ log10(base))+ 1.
在C/C++中,我使用这个公式来计算上面给出的结果.
long long int size = ((double)log10(num) / (double)log10(base)) + 1.0;
但遗憾的是,在某些情况下,公式并没有给出正确的答案,例如:
Number 8 in base 2 : 1,0,0,0
Number of digits: 4
Formula returned: 3
Number 64 in base 2 : 1,0,0,0,0,0,0
Number of digits: 7
Formula returned: 6
Number 64 in base 4 : 1,0,0,0
Number of digits: 4
Formula returned: 3
Number 125 in base 5 : 1,0,0,0
Number of digits: 4
Formula returned: 3
Number 128 in base 2 : …Run Code Online (Sandbox Code Playgroud) 的长双数据类型可以在C这些转换说明:%乐,%LE,%LF,%了Lg,%LG(参考).
我写了一个小程序来测试:
#include <stdio.h>
int main(void) {
long double d = 656546.67894L;
printf("%.0Le\n",d);
printf("%.0LE\n",d);
printf("%.0Lf\n",d);
printf("%.0Lg\n",d);
printf("%.0LG\n",d);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
-0
-4E-153
-0
-4E-153
-4E-153
但没有人能提供所需的输出,即656547(你可能很容易理解).是什么原因?
使用的编译器是gcc版本3.4.2(mingw-special).
好吧,我真的不是真的需要这个答案,我只是好奇.
类似*ptr++ = a的表达式是完全有效的,因为我们操作两个对象ptr,*ptr但如果我写*ptr++ = *ptr + a它仍然有效?
例如,请考虑以下代码段:
int main(void){
int a[] = {5,7,8,9,2};
int* p =a;
*p++ = 76; /*altering the first element */
*p++ = *p + 32; /*altering the second element */
p = a;
int i;
for(i = 0;i<5; i++)
printf("%d ",*p++);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我认为表达没有什么可担心的,*p++ = *p + 32;但我不确定所涉及的序列点.