#include<stdio.h>
int sel=5,out=10;
int findout(){
if(sel==5)
return out*=2;
}
int main(){
int ret1,ret2=-1;
ret1=findout();
printf("before %d %d %d",sel,out,ret1);
sel=8;out=7;
ret2=findout();
printf("\nafter %d %d %d",sel,out,ret2);
}
Run Code Online (Sandbox Code Playgroud)
输出:
在5 20 20之前
8 7 8之后
编辑:我的编译器没有显示任何警告.在这里你可以看到它.它在Ubuntu OS上的代码块GNU GCC编译器上
g++ -c Untitled1.cpp -o Untitled1.o
g++ -o Untitled1 Untitled1.o
Process terminated with status 0 (0 minute(s), 0 second(s))
0 error(s), 0 warning(s) (0 minute(s), 0 second(s))
Run Code Online (Sandbox Code Playgroud)
在第二种情况下,当我没有返回任何值(for sel=8和out =7)时,值ret2是8多少?
程序编译成功并打印1000甚至没有foo()从我们的main()函数调用函数.这怎么可能?
#include<stdio.h>
void foo()
{
#define ans 1000
}
int main() {
printf("%d", ans);
return 0;
}
Run Code Online (Sandbox Code Playgroud) Fortran具有计算效率,称为"计算goto".该构造使用分支表中的索引来执行直接转到.如果我没记错的语法是:
go to index (label1, label2, ...)
Run Code Online (Sandbox Code Playgroud)
其中索引用于引用括号列表中的代码指针(标签).
我有一个案例,计算goto是一个比switch语句更好的解决方案,并希望构建一个,但无法弄清楚如何.
现在在jibes和slings到来之前,编译器可以优化计算的goto,但我不能保证它会.
始终可以使用switch语句.在某些情况下,可以将switch语句优化为跳转表(计算goto的实现).但是,这只有在案例值的范围几乎是密集覆盖时才有可能(在低值到高值的范围内,每个整数几乎都有一个case语句).如果不是这种情况,则实现可能是二叉树.编译器编写器可以选择在适当的时候优化跳转表.在二叉树总是满足switch语句的语义的情况下,有时跳转表就足够了,让我问一下我是否可以在适当的时候保证跳转表.我无法控制编译器编写器.
作为一个简单的例子,我经常写词法分析器(FSM),我使用三个数据结构,一个用于将输入映射到可接受的字母表,一个用于执行节点转换,一个用于根据当前状态和输入执行一些代码值.FSM的实现是Mealy机器,而不是Moore机器,因此动作是在弧(转换)上执行而不是在节点上执行.
执行的操作通常很小,通常不超过一行源代码.我认识到可以使用函数,并且它们的使用消除了对跳转表的需要.但我相信我不能"指向"内联函数,因此,函数是从可调用程序关闭的.在大多数情况下,这比使用跳转表优化的switch语句效率低.如果我可以使用跳转表,那么我就避免了编译器编写者对优化的看法以及能够编写高效代码的问题.
关于与Fortran计算goto相关的问题,下面提到的一般情况.这不是对那些评论的批评.但质量问题,即使它们是真的,也没有回答这个问题.
下面有一个答案void* &&label;,我要感谢你.但是,唉,正如您所指出的那样,这是非标准的C/C++,很可能在将来不存在.所以,最好不要这样做.
我希望我已经回答了"获得更好的编译器"的评论.我希望我至少解决了使用函数指针的问题.最后,这对我来说是一个好奇的时刻.我不认为我应该提供我为什么认为这个问题具有一定的携带能力的杀菌史.但现在我知道了.无论什么时候,我的意思是什么时候,我写信给这个小组,我最好告诉你我所有的鸭子是什么,这样他们就可以被击落.
大家好.
我有一个名为my_list包含链接列表的全局变量(即,该变量是指向列表的第一个成员的指针)。该变量只能由两个线程(线程 A 和线程 B)编辑。如果列表变空,则该变量将设置为NULL。发生这种情况时,首先将变量设置为NULL,然后释放内存。
由于它是由两个线程编辑的,因此每次线程 A 或线程 B 接触该my_list变量时我都会使用互斥锁。到目前为止没有什么异常。
但是接下来出现了第三个线程,线程 C。该线程永远不会以任何方式接触链表,但它需要不时知道链表是否为空。所以,线程C唯一要做的就是
if (my_list) {
do_something_completely_unrelated();
}
Run Code Online (Sandbox Code Playgroud)
我必须为此使用互斥体吗?我相信这是一个原子操作,因此不需要互斥体。它是否正确?
编辑
我将在这里添加一些背景信息。我想避免使用互斥体的原因是列表很少(总是)更新,但来自线程 C 的检查每隔几毫秒发生一次,因此操作越少越好。
如果列表显示为非NULL,则线程 C 会触发使用互斥锁的正确检查,并且如果确认列表不为空,则线程 C 停止其强制检查。
我试图在python中嵌套for循环的变量长度,并能够重用变量.
for i in range(0,256):
for j in range(0,256):
for k in range(0,256):
...
myvar[i][j][k]...
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,有一个硬编码的嵌套for循环,长度为3.
它应该像这样工作:
for index[0] in range(0,256):
for index[1] in range(0,256):
for index[2] in range(0,256):
...
for index[n-1] in range(0,256):
for index[n] in range(0,256):
myvar[index[0]][index[1]][index[2]] ... [index[n-1]][index[n]] ...
Run Code Online (Sandbox Code Playgroud)
对于任意值 n
C &和&&C 之间有什么区别?
我的老师给了我这个例子:
int a = 8;
int b = 4;
printf("a & b = %d\n", a & b);
printf("a && b = %d\n", a && b);
Run Code Online (Sandbox Code Playgroud)
输出:
a & b = 0;
a && b = 1;
Run Code Online (Sandbox Code Playgroud)
我不确定为什么这会在一个场景中返回true而在另一个场景中返回false.
考虑以下代码:
typedef struct _Node Node;
struct _Node {
struct _Node * node;
};
Run Code Online (Sandbox Code Playgroud)
或这个:
typedef struct _Node {
struct _Node * node;
} Node;
Run Code Online (Sandbox Code Playgroud)
是否有任何理由不将其重写为
typedef struct Node Node;
struct Node {
Node * node;
};
Run Code Online (Sandbox Code Playgroud)
和
typedef struct Node {
Node * node;
} Node;
Run Code Online (Sandbox Code Playgroud)
据我所知,它们是等效的。这些下划线前缀的原因是什么?我还看到了其他变体,它不是下划线,而是第一次出现时使用大写字母,在第二次出现时使用小写字母,或者其他使它们有所不同的方式。一个例子在这里:
typedef struct Books {
char title[50];
char author[50];
char subject[100];
int book_id;
} Book;
Run Code Online (Sandbox Code Playgroud)
此示例来自tutorialspoint,我知道通常不应将其视为可靠的来源。但是,有什么充分的理由这样做吗?
如果C语言中的数组大小固定,那么此代码如何正常工作?这段代码有效,但是我的老师说我做错了。
int main()
{
int n,element,i;
printf("Enter the size of Array : ");
scanf("%d",&n);
int a[n];
for(i=0;i<n;i++){
printf("Enter %d no element : ",i+1);
scanf("%d",&a[i]);
}
printf("Enter the new element to be inserted at the End: ");
scanf("%d",&element);
n=n+1;
a[n-1]=element;
for(i=0;i<n;i++){
printf("%d\t",a[i]);
}
}
Run Code Online (Sandbox Code Playgroud) I understand that malloc is used to dynamically allocate memory. In my code, I have the following function that I sometimes call:
int memory_get_log(unsigned char day, unsigned char date, unsigned char month){
char fileName[11];
unsigned long readItems, itemsToRead;
F_FILE *file;
sprintf(fileName, "%s_%u%u%u%s", "LOG", day, date, month, ".bin");
file = f_open(fileName , "r");
itemsToRead = f_filelength( fileName );
//unsigned char *fileData = (unsigned char *) malloc(itemsToRead);
unsigned char fileData[itemsToRead]; //here I am not using malloc
readItems = f_read(fileData, 1, itemsToRead, file); …Run Code Online (Sandbox Code Playgroud) 如果我正在使用特定功能而不检查其返回值,我希望编译器发出错误。
我在Eclipse中使用GCC。
例如 :
int fun (){ return 3;}
void main ()
{
printf("%d",fun ());
}
Run Code Online (Sandbox Code Playgroud)
我调用该函数fun并打印返回值,但不检查返回值。相反,我想强制执行以下操作:
int ret=fun();
if(ret != some_value) { /* Do something */ }
printf("%d",fun ());
Run Code Online (Sandbox Code Playgroud)
这可能吗?