我们的组织有一个必要的编码规则(没有任何解释):
if ... else如果构造应该用else子句终止
例1:
if ( x < 0 )
{
x = 0;
} /* else not needed */
Run Code Online (Sandbox Code Playgroud)
例2:
if ( x < 0 )
{
x = 0;
}
else if ( y < 0 )
{
x = 3;
}
else /* this else clause is required, even if the */
{ /* programmer expects this will never be reached */
/* no change in value of x */
}
Run Code Online (Sandbox Code Playgroud)
这个设计要处理的边缘情况是什么?
关于其原因的另一个问题是,示例1 …
我找到了一些像这样得到struct大小的代码:
sizeof(struct struct_type[1]);
Run Code Online (Sandbox Code Playgroud)
我测试过它确实返回了它的大小struct_type.
和
sizeof(struct struct_type[2]);
Run Code Online (Sandbox Code Playgroud)
返回结构大小的两倍.
编辑:
struct_type 是一个结构,而不是一个数组:
struct struct_type {
int a;
int b;
};
Run Code Online (Sandbox Code Playgroud)
究竟struct_type[1]是什么意思?
最近,我发现有些情况绝对会违反C++的ODR,但在C编译器中会编译好.
例如,这个奇怪的场景(和我一起):
来源1
int var_global=-3;
Run Code Online (Sandbox Code Playgroud)
来源2
#include <stdio.h>
#include <conio.h>
unsigned int var_global;
int main() {
printf("%d \n",var_global);
getch();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我有打印结果-3(即使在源2 var_global中unsigned)并且没有关于重新定义的错误var_global.
我知道C与C++有不同的规则,但我认为它不是那么不同.
我有谷歌并阅读了很多结果,但没有像 C++ 这样的官方结果.
所以问题是:
C有像C++这样的一个定义规则吗?
和:
什么叫官方?
我需要它与C++规则进行比较,这样我才能更深入地理解这两种语言.
p/s:我使用Visual Studio 2010编译上面的代码.
元组是以逗号分隔的值列表
所以声明元组的有效语法是:
tup = 'a', 'b', 'c', 'd'
Run Code Online (Sandbox Code Playgroud)
但我经常看到的是这样的声明:
tup = ('a', 'b', 'c', 'd')
Run Code Online (Sandbox Code Playgroud)
将元组括在括号中有什么好处?
我正在查看 Quake II 源代码,发现它们阻止用户运行游戏root:
/* Prevent running Quake II as root. Only very mad
minded or stupid people even think about it. :) */
if (getuid() == 0)
{
printf("Quake II shouldn't be run as root! Backing out to save your ass. If\n");
printf("you really know what you're doing, edit src/unix/main.c and remove\n");
printf("this check. But don't complain if Quake II eats your dog afterwards!\n");
return 1;
}
Run Code Online (Sandbox Code Playgroud)
在 Quake II 中这样做的具体原因是什么?
为什么sum(1,2) 导致TypeError: 'int' object is not iterable和sum(1,2,3) 导致TypeError: sum expected at most 2 arguments, got 3,但如果我添加更多括号就可以了?
sum((1,2,3))
Run Code Online (Sandbox Code Playgroud)
同时, max(1,2,3)和max((1,2,3)) 都行。
我正在重用具有与此类似的语法的代码:
#include "..\..\..\directory-name"
Run Code Online (Sandbox Code Playgroud)
通常我们包含一个文件,但在这种情况下包含一个目录.
它是一个有效的语法,它会做什么?
如果您不希望(或不能)使用地址初始化指针,我经常听到人们说您应该使用NULL它来初始化指针,这是一个好习惯。
您可以找到人们也在SO中说类似的话,例如在这里。
在许多C项目的工作,我不认为这是一个很好的做法,或者至少在某种程度上优于未初始化与任何指针。
我最大的理由之一是:初始化一个指针会NULL增加空指针取消引用的机会,这可能会使整个软件崩溃,这很糟糕。
因此,您能告诉我说这是一个好习惯还是人们只是说这是理所当然的原因(就像您应该始终初始化一个变量一样)吗?
请注意,我尝试在Misra 2004中查找,也没有找到任何规则或建议。
更新:
因此,大多数注释和答案都给出了使用该指针之前可能具有随机地址的主要原因,因此最好将其设置为null,以便您更快地解决问题。
为了使我的观点更加清楚,我认为从实用的角度来看,如今在商业C软件中这没有任何意义。大多数静态分析器都会正确检测到所使用的未分配指针,这就是为什么我更喜欢将其取消初始化,因为如果我使用NULL对其进行初始化,那么当开发人员忘记将其分配给“真实”地址时,它会通过静态分析器,并会导致运行时出现空指针问题。