class Foo {
public Foo() { }
}
class Bar {
static Foo foo = new Foo(); // This is legal...
public static void main(String[] args) {
static int a = 0; // ... But why this is not?
}
}
Run Code Online (Sandbox Code Playgroud)
为什么我们不能在静态函数内声明静态变量?
我正在研究C中未定义的行为,我发表了一个声明
函数参数的评估没有特定的顺序
但那么标准调用约定如何_cdecl和_stdcall,其定义(在一本书中)说参数是从右到左进行评估.
现在我对这两个定义感到困惑,根据UB,一个状态与另一个定义不同,这是根据调用约定的定义.请证明两者的合理性.
我正在阅读界面文档Serializable,其中我找到以下几行:
为了允许序列化非可序列化类的子类型,子类型可以承担保存和恢复超类型的公共,受保护和(如果可访问)包字段的状态的责任.只有当它扩展的类具有可访问的no-arg构造函数来初始化类的状态时,子类型才可以承担此责任.如果不是这种情况,则声明类Serializable是错误的.将在运行时检测到错误.
但是,基类的无参数构造函数在恢复对象状态方面的作用是什么?
我知道以下是未定义的,因为我试图在同一个表达式中读取和写入变量的值,即
int a=5;
a=a++;
Run Code Online (Sandbox Code Playgroud)
但如果是这样,那么为什么以下代码片段未定义
int a=5;
a=a+1;
Run Code Online (Sandbox Code Playgroud)
在这里我也试图修改它的值a并同时写入它.
还解释了为什么标准没有解决这个问题或者删除这个未定义的行为,尽管事实上他们知道它是未定义的?
我正在阅读 Head First Design 模式并坚持好莱坞原则。早些时候我读到了控制反转,我理解的是,这是一个设计原则(有些人也称之为模式),通过它传统的程序流程从“高层模块调用低层模块”变为“低层模块调用高层模块” ”(通常通过抽象),因此我们可以对特定的低级模块具有非常低的依赖性,并且更改低级模块不会对我们的更高级别或接近业务模块产生任何影响。
但是当作者对好莱坞原则说了以下几句话时,我感到困惑:-
第 296 页
根据好莱坞原则,我们允许低级组件将自己挂接到系统中,但高级组件决定何时需要它们以及如何需要它们。换句话说,高级组件给了低级组件“不要打电话给我们,我们会打电话给你”的待遇。
在最后一行,据说高层组件给低层组件一个“不要打电话给我们,我们会打电话给你”的待遇。这意味着我们的高级组件实际上正在调用低级组件,因此这似乎打破了控制反转原则和依赖反转原则。
请澄清这一点。
c# java design-patterns dependency-injection design-principles
我使用以下命令配置服务故障恢复
sc failure "service" actions= ""/60000/restart/60000/run/120000 reset= 60 command = "\"c:\\windows\notepad2.exe
Run Code Online (Sandbox Code Playgroud)
(用于测试的notepad2.exe)
从这里的Microsoft文档: -
操作
此字段包含一个整数值数组,用于指定服务失败时SCM采取的操作.用[〜]分隔数组中的值.数组的第N个元素中的整数值指定服务在第N次失败时执行的操作.
所以,我从中得到的是失败的数量将决定行动=>对于第一次失败将执行行动[0]并且将执行第二次行动[ 1 ]并且对于所有后续失败行动[ 2 ]将是
我有以下服务配置来测试此行为: -
然后我尝试通过使用来杀死运行服务的进程taskkill.
然后我再次尝试在约2分钟后终止服务(=>重置计数将故障计数设置为0,因为它配置为1分钟).
在上图中,很明显为什么count重置为0因为reset我们已经给出60 sec了设置并且我们的服务运行的次数超过了2 mins.
但是为恢复描述的操作是错误的,因为重新启动服务是第二次失败的操作,而不是第一次失败.
那么为什么失败的计数会变为1但是恢复的行动是与第二次失败行动相对应的行动?
如果我们说:
char *p="name";
Run Code Online (Sandbox Code Playgroud)
那我们该怎么办呢
if(p=="name"){
printf("able"};//this if condition is true but why?
Run Code Online (Sandbox Code Playgroud)
因为"name"这里是一个字符串文字,并且p是一个保存字符串基址的指针,那么为什么上述语句工作正常?
我有以下代码片段来理解指针到特定长度的字符数组的工作,使用以下示例代码.
#include <stdio.h>
int main(){
char sports[5][15] = {
"cricket",
"football",
"hockey",
"basketball"
};
char (*sptr)[15] = sports;
if ( sptr+1 == sptr[1]){
printf("oh no! what is this");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如何sptr+1和sptr[1]可以相等?因为第一个意味着增加地址,它sptr由一个存储,第二个意味着获取存储在其中的地址的值sptr + 1.
假设我已经使用了分配内存malloc(),如果我在我的代码中执行:
char *newline = realloc ( oldline , newsize );
// Assuming oldline is the pointer to which the starting address
// of the memory which malloc() has returned, is assigned and,
// say, newsize is integer having 100 value.
Run Code Online (Sandbox Code Playgroud)
现在我的问题是: -
newline指向与oldline之前的初始地址相同的地址? oldline将被释放(隐式)并将newline负责内存寻址? 完成上述代码并完成工作后,我该怎么办才能释放内存
free(newline);
Run Code Online (Sandbox Code Playgroud)
要么
free(oldline);
Run Code Online (Sandbox Code Playgroud)
或两者?
我想按字母顺序排序字符串数组,这是c中字符数组的数组.这是我函数的主体: -
char (*)[6] sort_strings ( char (*sptr) [6])
{
//code.
//return a pointer of type char (*)[6].
}
Run Code Online (Sandbox Code Playgroud)
但编译器无法识别这种类型的返回类型.它给出了错误说: -
预期标识符或'('''''''令牌
那么我如何返回char(*)[6]类型的指针?我还有另一个问题,首先看main()如下: -
int main(){
char names[5][6] = {
"tom",
"joe",
"adam"
};
char (*result)[6] = sort_strings (names);
//code for printing the result goes here.
return 0;
}
Run Code Online (Sandbox Code Playgroud)
所以我的下一个问题是,当我调用sort strings (names)编译器时也会给我警告: -
初始化使得整数指针不带强制转换
所以我的问题是: -
1.如何从函数返回char(*)[6]?
2.当我调用此函数时,为什么编译器会给我警告?
我在Windows上的代码块上运行此代码.