我在C#,java中找到了很多关于数据类型可变性的信息......但是纯粹的C.
例如,int默认情况下在C中是不可变的吗?
例如,查看以下代码示例:
#include <stdio.h>
int main()
{
int a,b,c;
b=0;
c=0;
a=b+c;
b=1;
c=2;
printf("1st time %d\n",a);//gives out 0
c=3;
printf("2nd time %d",a);//gives out 0
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码表明普通int是不可改变的,对吗?
我面临的问题是free()什么是malloc().有没有办法避免在以下代码中多次写入free(p)?
char *p = (char*) (malloc(100 * sizeof(char)));
if (A)
{
free(p);
p=NULL;
return -1;
}
a++;
if (B)
{
free(p);
p=NULL;
return -1;
}
b++;
if (C)
{
free(p);
p=NULL;
return -1;
}
free(p);
p=NULL;
return 0;
Run Code Online (Sandbox Code Playgroud) 例如,我有
char* c=(char *)malloc(100*sizeof(char));
printf("0x%x,c);
printf("0x%x,&c);
Run Code Online (Sandbox Code Playgroud)
这将显示不同的价值c和&c.
但是,如果我有以下内容:
char d[100];
printf("0x%x,d);
printf("0x%x,&d);
Run Code Online (Sandbox Code Playgroud)
这表明价值d和&d是一样的.
如何产生的第一个代码让我对不同的结果c和&c?
例如,假设 a是一个公共静态成员ClassA.
namespace SPACE{
char* ClassA::a=NULL;
ClassA::ClassA()
{
ClassA::a="initialized here";
}
}
Run Code Online (Sandbox Code Playgroud)
所以有两个问题:
a=NULL被调用?之前main()或之后? NULL和定义两次“initialized here"?class D
{
public:
~D() { throw std::exception(); }
};
int main()
{
try
{
try
{
D d;
}
catch (...)
{
cout << "1";
}
}
catch (std::exception& e)
{
cout << "2";
}
}
Run Code Online (Sandbox Code Playgroud)
我的轻描淡写是,这应该在2中捕获。但是它没有捕获,而是终止了程序。
可以说我有以下代码:
if (a&&b)
{
...
}
Run Code Online (Sandbox Code Playgroud)
第一个问题,谁决定在这种情况下使用短路评估?编译器还是C标准?
第二个问题,哪一个将首先评估?a或b.序列由谁决定,有没有办法改变我的代码中的序列?