gpt4 book ai didi

c - Algol 和 C 在类型转换中的语义差异

转载 作者:太空宇宙 更新时间:2023-11-04 00:28:51 26 4
gpt4 key购买 nike

假设我们在 Algol 68 和 C 中分别有如下指令:ref int x := 5;(int*) x = 5;。它们的语义区别是什么?,是一样的吗?,因为我认为第二个说“x 将指向一个常量”(无法编译),第一个说“x 将指向一个内存”指向另一个包含常数 5"的存储单元的单元。它是否正确?如果不正确,您能否解释一下并举一些例子来理解这一点?

最佳答案

Algol 68 有许多隐式强制转换可用,具体取决于上下文(强、稳、温、弱和软上下文):cf Wikipedia & Algol68's Coercion Hierarchy .

Algol68 可以隐式处理:

  1. 提高精度和维度(强)
  2. union 不同类型(公司)
  3. 有针对性的取消引用(温顺和弱)
  4. 处理、取消处理(软)

C 转换具有更多限制的隐式转换:

  1. 仅限于在某些情况下将精度和float 隐式“扩大”为int。扩展到数组需要使用“&”运算符的指针和手动编码。
  2. union 必须手动编码/创建。
  3. 在转换过程中没有解除引用(C 强制编码人员使用“*”显式计算解除引用指针的次数运营商)。
  4. 没有参数的过程必须通过名称明确定义并使用“()”运算符调用。

带有输出的示例代码...

文件:deref_and_cast.c

#include <stdio.h>
#include <stdlib.h>

main(){
auto int*** crrri;
crrri=(int***)malloc(sizeof(int**));
*crrri=(int**)malloc(sizeof(int*));
**crrri=(int*)malloc(sizeof(int));
***crrri=255; /* coder to explicitly work out how many times dereference */
printf("%5.1f\n",(float)***crrri); /* Again deref is muilt-explicit */
}

输出:

255.0

文件:coerce_and_cast.a68

#!/usr/bin/a68g --script #
# -*- coding: utf-8 -*- #

LOC REF REF REF INT crrri;
REF REF REF REF INT(crrri):=HEAP REF REF INT;
REF REF REF INT(crrri):=HEAP REF INT;
REF REF INT(crrri):=HEAP INT;
REF INT(crrri):=255; # targeted dereferencing (3x) depending on contect #
printf(($"example meek coercion:"g(-5,1)l$,REAL(crrri)));

隐式强制转换的层次结构示例

PROC VOID raise exception = end; # Implicitly cast a "GO TO" to a PROC #

# Soft: deprocedure a PROC to a VALUE #
printf(($"Soft:"gl$,random)); # Implicit Coercion #
printf(($"Soft:"gl$,REAL(random))); # Explicitly cast/deprocedure #

# Weak: dereference pointer chain to a "name" (LHS in C lingo) #
COMPL compl:= 0;
re OF compl := crrri; # Implicit Coercion #
REF REAL(re OF compl) := crrri; # Explicitly cast/dereference #
printf(($"Weak:"g(-0,4)g(7,4)"i"l$,compl));

# Meek: dereference to a value #
printf(($"Meek:"gl$,sin(crrri))); # Implicit Coercion #
printf(($"Meek:"gl$,sin(REAL(crrri)))); # Explicitly cast/dereference #

# Firm: unite to a UNION #
MODE IRC=UNION(INT,REAL,COMPL);
OP SIN = (IRC z)IRC: (z|(INT i):sin(i),(REAL r):sin(r),(COMPL z):complex sin(z));
printf(($"Firm:"gl$,SIN 1)); # Implicit Coercion #
printf(($"Firm:"gl$,SIN IRC(1))); # Explicitly cast/unite #

# Strong: widen to higher precision OR to an array #
FLEX [0]BOOL bool array := BIN crrri; # Implicit Coercion #
bool array := []BOOL(BIN crrri); # Explicitly cast/widen #
printf(($"Strong:"$,$g$,bool array,$l$));

end: SKIP

输出:

example meek coercion:255.0
Soft:+2.11679610884246e -1
Soft:+4.01945464342605e -1
Weak:255.0000+0.0000i
Meek:-5.06391634924491e -1
Meek:-5.06391634924491e -1
Firm:+8.41470984807897e -1
Firm:+8.41470984807897e -1
Strong:FFFFFFFFFFFFFFFFFFFFFFFFTTTTTTTT

关于c - Algol 和 C 在类型转换中的语义差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41993990/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com